Finish ANGLE update
https://bugs.webkit.org/show_bug.cgi?id=204911

The last ANGLE update patch didn't include all the changed files.
This patch updates the rest of the files.

Patch by James Darpinian <jdarpinian@chromium.org> on 2019-12-05
Reviewed by Alex Christensen.

* src/tests: Lots of changed files from upstream ANGLE.
* src/third_party/compiler/README.chromium:
* third_party/VK-GL-CTS/README.angle: Added.
* third_party/deqp/README.angle: Removed.
* third_party/googletest/README.angle: Removed.
* third_party/libpng/BUILD.gn:
* third_party/spirv-cross/README.angle: Added.
* util/OSWindow.h:
* util/egl_loader_autogen.cpp:
(angle::LoadEGL):
* util/egl_loader_autogen.h:
* util/fuchsia/ScenicWindow.cpp:
(ScenicWindow::resetNativeWindow):
* util/fuchsia/ScenicWindow.h:
* util/gles_loader_autogen.cpp:
(angle::LoadGLES):
* util/gles_loader_autogen.h:
* util/osx/OSXWindow.h:
* util/osx/OSXWindow.mm:
(OSXWindow::initialize):
* util/ozone/OzoneWindow.h:
* util/posix/crash_handler_posix.cpp:
(angle::InitCrashHandler):
* util/posix/test_utils_posix.cpp:
(angle::GetTempDir):
(angle::CreateTemporaryFileInDir):
(angle::DeleteFile):
(angle::LaunchProcess):
(angle::NumberOfProcessors):
* util/shader_utils.cpp:
(CompileShaderFromFile):
(CompileProgramFromFiles):
* util/test_utils.cpp: Added.
(angle::CreateTemporaryFile):
(angle::GetFileSize):
(angle::ReadEntireFileToString):
(angle::ProcessHandle::ProcessHandle):
(angle::ProcessHandle::~ProcessHandle):
(angle::ProcessHandle::operator=):
(angle::ProcessHandle::reset):
* util/test_utils.h:
* util/test_utils_unittest.cpp: Added.
(angle::NormalizeNewLines):
(angle::TEST):
* util/test_utils_unittest_helper.cpp: Added.
(main):
* util/test_utils_unittest_helper.h: Added.
* util/util.gni:
* util/windows/WGLWindow.cpp:
* util/windows/test_utils_win.cpp:
(angle::InitCrashHandler):
(angle::TerminateCrashHandler):
(angle::LaunchProcess):
(angle::GetTempDir):
(angle::CreateTemporaryFileInDir):
(angle::DeleteFile):
(angle::NumberOfProcessors):
* util/windows/win32/Win32Window.cpp:
(Win32Window::initialize):
* util/windows/win32/test_utils_win32.cpp:
(angle::StabilizeCPUForBenchmarking):
* util/x11/X11Window.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@253192 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/ThirdParty/ANGLE/ChangeLog b/Source/ThirdParty/ANGLE/ChangeLog
index 10fd032..bcc4ddf 100644
--- a/Source/ThirdParty/ANGLE/ChangeLog
+++ b/Source/ThirdParty/ANGLE/ChangeLog
@@ -1,3 +1,76 @@
+2019-12-05  James Darpinian  <jdarpinian@chromium.org>
+
+        Finish ANGLE update
+        https://bugs.webkit.org/show_bug.cgi?id=204911
+
+        The last ANGLE update patch didn't include all the changed files.
+        This patch updates the rest of the files.
+
+        Reviewed by Alex Christensen.
+
+        * src/tests: Lots of changed files from upstream ANGLE.
+        * src/third_party/compiler/README.chromium:
+        * third_party/VK-GL-CTS/README.angle: Added.
+        * third_party/deqp/README.angle: Removed.
+        * third_party/googletest/README.angle: Removed.
+        * third_party/libpng/BUILD.gn:
+        * third_party/spirv-cross/README.angle: Added.
+        * util/OSWindow.h:
+        * util/egl_loader_autogen.cpp:
+        (angle::LoadEGL):
+        * util/egl_loader_autogen.h:
+        * util/fuchsia/ScenicWindow.cpp:
+        (ScenicWindow::resetNativeWindow):
+        * util/fuchsia/ScenicWindow.h:
+        * util/gles_loader_autogen.cpp:
+        (angle::LoadGLES):
+        * util/gles_loader_autogen.h:
+        * util/osx/OSXWindow.h:
+        * util/osx/OSXWindow.mm:
+        (OSXWindow::initialize):
+        * util/ozone/OzoneWindow.h:
+        * util/posix/crash_handler_posix.cpp:
+        (angle::InitCrashHandler):
+        * util/posix/test_utils_posix.cpp:
+        (angle::GetTempDir):
+        (angle::CreateTemporaryFileInDir):
+        (angle::DeleteFile):
+        (angle::LaunchProcess):
+        (angle::NumberOfProcessors):
+        * util/shader_utils.cpp:
+        (CompileShaderFromFile):
+        (CompileProgramFromFiles):
+        * util/test_utils.cpp: Added.
+        (angle::CreateTemporaryFile):
+        (angle::GetFileSize):
+        (angle::ReadEntireFileToString):
+        (angle::ProcessHandle::ProcessHandle):
+        (angle::ProcessHandle::~ProcessHandle):
+        (angle::ProcessHandle::operator=):
+        (angle::ProcessHandle::reset):
+        * util/test_utils.h:
+        * util/test_utils_unittest.cpp: Added.
+        (angle::NormalizeNewLines):
+        (angle::TEST):
+        * util/test_utils_unittest_helper.cpp: Added.
+        (main):
+        * util/test_utils_unittest_helper.h: Added.
+        * util/util.gni:
+        * util/windows/WGLWindow.cpp:
+        * util/windows/test_utils_win.cpp:
+        (angle::InitCrashHandler):
+        (angle::TerminateCrashHandler):
+        (angle::LaunchProcess):
+        (angle::GetTempDir):
+        (angle::CreateTemporaryFileInDir):
+        (angle::DeleteFile):
+        (angle::NumberOfProcessors):
+        * util/windows/win32/Win32Window.cpp:
+        (Win32Window::initialize):
+        * util/windows/win32/test_utils_win32.cpp:
+        (angle::StabilizeCPUForBenchmarking):
+        * util/x11/X11Window.h:
+
 2019-12-02  Ross Kirsling  <ross.kirsling@sony.com>
 
         Unreviewed WinCairo build fix following r252989.
diff --git a/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests.gni b/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests.gni
index 9b7bed6..f788a3e 100644
--- a/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests.gni
+++ b/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests.gni
@@ -43,6 +43,7 @@
   "gl_tests/FramebufferRenderMipmapTest.cpp",
   "gl_tests/FramebufferTest.cpp",
   "gl_tests/GeometryShaderTest.cpp",
+  "gl_tests/GetImageTest.cpp",
   "gl_tests/gles1/AlphaFuncTest.cpp",
   "gl_tests/gles1/BasicDrawTest.cpp",
   "gl_tests/gles1/ClientActiveTextureTest.cpp",
@@ -81,6 +82,7 @@
   "gl_tests/MipmapTest.cpp",
   "gl_tests/MultiDrawTest.cpp",
   "gl_tests/MultisampleCompatibilityTest.cpp",
+  "gl_tests/MultisampledRenderToTextureTest.cpp",
   "gl_tests/MultisampleTest.cpp",
   "gl_tests/MultithreadingTest.cpp",
   "gl_tests/MultiviewDrawTest.cpp",
@@ -139,6 +141,7 @@
   "egl_tests/EGLCreateContextAttribsTest.cpp",
   "egl_tests/EGLDebugTest.cpp",
   "egl_tests/EGLNoConfigContextTest.cpp",
+  "egl_tests/EGLPrintEGLinfoTest.cpp",
   "egl_tests/EGLProgramCacheControlTest.cpp",
   "egl_tests/EGLQueryContextTest.cpp",
   "egl_tests/EGLRecordableTest.cpp",
@@ -161,6 +164,8 @@
 angle_end2end_tests_mac_sources = [
   "egl_tests/EGLDeviceCGLTest.cpp",
   "egl_tests/EGLIOSurfaceClientBufferTest.cpp",
+  "test_utils/angle_test_instantiate_apple.mm",
+  "test_utils/angle_test_instantiate_apple.h",
 ]
 angle_end2end_tests_win_sources = [
   "gl_tests/D3DImageFormatConversionTest.cpp",
diff --git a/Source/ThirdParty/ANGLE/src/tests/angle_perftests.gni b/Source/ThirdParty/ANGLE/src/tests/angle_perftests.gni
index 5b16a3b..e8f4356 100644
--- a/Source/ThirdParty/ANGLE/src/tests/angle_perftests.gni
+++ b/Source/ThirdParty/ANGLE/src/tests/angle_perftests.gni
@@ -19,6 +19,13 @@
   "test_utils/gl_raii.h",
 ]
 
+if (is_mac) {
+  _angle_perf_test_common_sources += [
+    "test_utils/angle_test_instantiate_apple.mm",
+    "test_utils/angle_test_instantiate_apple.h",
+  ]
+}
+
 angle_perf_tests_sources = _angle_perf_test_common_sources + [
                              "perf_tests/BlitFramebufferPerf.cpp",
                              "perf_tests/BindingPerf.cpp",
diff --git a/Source/ThirdParty/ANGLE/src/tests/angle_unittests.gni b/Source/ThirdParty/ANGLE/src/tests/angle_unittests.gni
index b1686cc..d6a86a3 100644
--- a/Source/ThirdParty/ANGLE/src/tests/angle_unittests.gni
+++ b/Source/ThirdParty/ANGLE/src/tests/angle_unittests.gni
@@ -15,7 +15,6 @@
   "../common/matrix_utils_unittest.cpp",
   "../common/string_utils_unittest.cpp",
   "../common/system_utils_unittest.cpp",
-  "../common/system_utils_unittest_helper.h",
   "../common/utilities_unittest.cpp",
   "../common/vector_utils_unittest.cpp",
   "../feature_support_util/feature_support_util_unittest.cpp",
@@ -130,6 +129,8 @@
   "../tests/test_utils/ShaderCompileTreeTest.h",
   "../tests/test_utils/ShaderCompileTreeTest.cpp",
   "../tests/test_utils/ShaderExtensionTest.h",
+  "../../util/test_utils_unittest.cpp",
+  "../../util/test_utils_unittest_helper.h",
 ]
 
 # TODO(jmadill): should probably call this windows sources
@@ -138,9 +139,9 @@
   "../tests/compiler_tests/UnrollFlatten_test.cpp",
 ]
 
-angle_unittests_helper_sources = [
-  "../common/system_utils_unittest_helper.cpp",
-  "../common/system_utils_unittest_helper.h",
+test_utils_unittest_helper_sources = [
+  "../../util/test_utils_unittest_helper.cpp",
+  "../../util/test_utils_unittest_helper.h",
 ]
 
 if (is_android) {
diff --git a/Source/ThirdParty/ANGLE/src/tests/angle_white_box_tests.gni b/Source/ThirdParty/ANGLE/src/tests/angle_white_box_tests.gni
index cc736f3..0c8221b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/angle_white_box_tests.gni
+++ b/Source/ThirdParty/ANGLE/src/tests/angle_white_box_tests.gni
@@ -25,3 +25,7 @@
   "gl_tests/VulkanFormatTablesTest.cpp",
   "gl_tests/VulkanUniformUpdatesTest.cpp",
 ]
+angle_white_box_tests_mac_sources = [
+  "test_utils/angle_test_instantiate_apple.mm",
+  "test_utils/angle_test_instantiate_apple.h",
+]
diff --git a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp
index acff961..0766cce 100644
--- a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp
@@ -16,33 +16,33 @@
 
 TEST(ImmutableStringTest, ScriptGeneratedHashesMatch)
 {
-    ASSERT_EQ(0x0000026cu, ImmutableString("radians(00B").mangledNameHash());
+    ASSERT_EQ(0x0000026du, ImmutableString("radians(00B").mangledNameHash());
     ASSERT_EQ(0x00000146u, ImmutableString("radians(10B").mangledNameHash());
     ASSERT_EQ(0x00000108u, ImmutableString("radians(20B").mangledNameHash());
-    ASSERT_EQ(0x0000039bu, ImmutableString("radians(30B").mangledNameHash());
+    ASSERT_EQ(0x0000039cu, ImmutableString("radians(30B").mangledNameHash());
     ASSERT_EQ(0x000001d8u, ImmutableString("degrees(00B").mangledNameHash());
-    ASSERT_EQ(0x0000031cu, ImmutableString("degrees(10B").mangledNameHash());
+    ASSERT_EQ(0x0000031du, ImmutableString("degrees(10B").mangledNameHash());
     ASSERT_EQ(0x00000046u, ImmutableString("degrees(20B").mangledNameHash());
     ASSERT_EQ(0x00000168u, ImmutableString("degrees(30B").mangledNameHash());
-    ASSERT_EQ(0x00000347u, ImmutableString("sin(00B").mangledNameHash());
-    ASSERT_EQ(0x00000203u, ImmutableString("sin(10B").mangledNameHash());
-    ASSERT_EQ(0x00000224u, ImmutableString("sin(20B").mangledNameHash());
+    ASSERT_EQ(0x00000348u, ImmutableString("sin(00B").mangledNameHash());
+    ASSERT_EQ(0x00000204u, ImmutableString("sin(10B").mangledNameHash());
+    ASSERT_EQ(0x00000225u, ImmutableString("sin(20B").mangledNameHash());
     ASSERT_EQ(0x0000010fu, ImmutableString("sin(30B").mangledNameHash());
-    ASSERT_EQ(0x0000020fu, ImmutableString("cos(00B").mangledNameHash());
-    ASSERT_EQ(0x00000356u, ImmutableString("cos(10B").mangledNameHash());
-    ASSERT_EQ(0x00000399u, ImmutableString("cos(20B").mangledNameHash());
-    ASSERT_EQ(0x000002b3u, ImmutableString("cos(30B").mangledNameHash());
-    ASSERT_EQ(0x00000206u, ImmutableString("tan(00B").mangledNameHash());
-    ASSERT_EQ(0x0000034du, ImmutableString("tan(10B").mangledNameHash());
-    ASSERT_EQ(0x0000039du, ImmutableString("tan(20B").mangledNameHash());
+    ASSERT_EQ(0x00000210u, ImmutableString("cos(00B").mangledNameHash());
+    ASSERT_EQ(0x00000357u, ImmutableString("cos(10B").mangledNameHash());
+    ASSERT_EQ(0x0000039au, ImmutableString("cos(20B").mangledNameHash());
+    ASSERT_EQ(0x000002b4u, ImmutableString("cos(30B").mangledNameHash());
+    ASSERT_EQ(0x00000207u, ImmutableString("tan(00B").mangledNameHash());
+    ASSERT_EQ(0x0000034eu, ImmutableString("tan(10B").mangledNameHash());
+    ASSERT_EQ(0x0000039eu, ImmutableString("tan(20B").mangledNameHash());
     ASSERT_EQ(0x000000f4u, ImmutableString("tan(30B").mangledNameHash());
-    ASSERT_EQ(0x00000231u, ImmutableString("asin(00B").mangledNameHash());
-    ASSERT_EQ(0x00000378u, ImmutableString("asin(10B").mangledNameHash());
+    ASSERT_EQ(0x00000232u, ImmutableString("asin(00B").mangledNameHash());
+    ASSERT_EQ(0x00000379u, ImmutableString("asin(10B").mangledNameHash());
     ASSERT_EQ(0x00000018u, ImmutableString("asin(20B").mangledNameHash());
     ASSERT_EQ(0x00000136u, ImmutableString("asin(30B").mangledNameHash());
     ASSERT_EQ(0x00000060u, ImmutableString("acos(00B").mangledNameHash());
-    ASSERT_EQ(0x000002e6u, ImmutableString("acos(10B").mangledNameHash());
-    ASSERT_EQ(0x00000288u, ImmutableString("acos(20B").mangledNameHash());
+    ASSERT_EQ(0x000002e7u, ImmutableString("acos(10B").mangledNameHash());
+    ASSERT_EQ(0x00000289u, ImmutableString("acos(20B").mangledNameHash());
     ASSERT_EQ(0x00000166u, ImmutableString("acos(30B").mangledNameHash());
     ASSERT_EQ(0x000001f2u, ImmutableString("atan(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000031u, ImmutableString("atan(10B10B").mangledNameHash());
@@ -51,261 +51,261 @@
     ASSERT_EQ(0x000001dfu, ImmutableString("atan(00B").mangledNameHash());
     ASSERT_EQ(0x00000070u, ImmutableString("atan(10B").mangledNameHash());
     ASSERT_EQ(0x00000086u, ImmutableString("atan(20B").mangledNameHash());
-    ASSERT_EQ(0x00000323u, ImmutableString("atan(30B").mangledNameHash());
-    ASSERT_EQ(0x0000028au, ImmutableString("sinh(00B").mangledNameHash());
-    ASSERT_EQ(0x00000322u, ImmutableString("sinh(10B").mangledNameHash());
+    ASSERT_EQ(0x00000324u, ImmutableString("atan(30B").mangledNameHash());
+    ASSERT_EQ(0x0000028bu, ImmutableString("sinh(00B").mangledNameHash());
+    ASSERT_EQ(0x00000323u, ImmutableString("sinh(10B").mangledNameHash());
     ASSERT_EQ(0x0000017eu, ImmutableString("sinh(20B").mangledNameHash());
     ASSERT_EQ(0x000000ecu, ImmutableString("sinh(30B").mangledNameHash());
     ASSERT_EQ(0x00000158u, ImmutableString("cosh(00B").mangledNameHash());
-    ASSERT_EQ(0x00000306u, ImmutableString("cosh(10B").mangledNameHash());
-    ASSERT_EQ(0x00000335u, ImmutableString("cosh(20B").mangledNameHash());
-    ASSERT_EQ(0x00000267u, ImmutableString("cosh(30B").mangledNameHash());
+    ASSERT_EQ(0x00000307u, ImmutableString("cosh(10B").mangledNameHash());
+    ASSERT_EQ(0x00000336u, ImmutableString("cosh(20B").mangledNameHash());
+    ASSERT_EQ(0x00000268u, ImmutableString("cosh(30B").mangledNameHash());
     ASSERT_EQ(0x00000047u, ImmutableString("tanh(00B").mangledNameHash());
     ASSERT_EQ(0x00000167u, ImmutableString("tanh(10B").mangledNameHash());
-    ASSERT_EQ(0x0000027cu, ImmutableString("tanh(20B").mangledNameHash());
+    ASSERT_EQ(0x0000027du, ImmutableString("tanh(20B").mangledNameHash());
     ASSERT_EQ(0x0000000du, ImmutableString("tanh(30B").mangledNameHash());
-    ASSERT_EQ(0x00000261u, ImmutableString("asinh(00B").mangledNameHash());
-    ASSERT_EQ(0x000003a1u, ImmutableString("asinh(10B").mangledNameHash());
+    ASSERT_EQ(0x00000262u, ImmutableString("asinh(00B").mangledNameHash());
+    ASSERT_EQ(0x000003a2u, ImmutableString("asinh(10B").mangledNameHash());
     ASSERT_EQ(0x000000f1u, ImmutableString("asinh(20B").mangledNameHash());
-    ASSERT_EQ(0x0000020au, ImmutableString("asinh(30B").mangledNameHash());
+    ASSERT_EQ(0x0000020bu, ImmutableString("asinh(30B").mangledNameHash());
     ASSERT_EQ(0x0000017bu, ImmutableString("acosh(00B").mangledNameHash());
     ASSERT_EQ(0x000000abu, ImmutableString("acosh(10B").mangledNameHash());
     ASSERT_EQ(0x0000001du, ImmutableString("acosh(20B").mangledNameHash());
-    ASSERT_EQ(0x000002a3u, ImmutableString("acosh(30B").mangledNameHash());
+    ASSERT_EQ(0x000002a4u, ImmutableString("acosh(30B").mangledNameHash());
     ASSERT_EQ(0x00000082u, ImmutableString("atanh(00B").mangledNameHash());
     ASSERT_EQ(0x0000001eu, ImmutableString("atanh(10B").mangledNameHash());
-    ASSERT_EQ(0x000002cbu, ImmutableString("atanh(20B").mangledNameHash());
+    ASSERT_EQ(0x000002ccu, ImmutableString("atanh(20B").mangledNameHash());
     ASSERT_EQ(0x00000193u, ImmutableString("atanh(30B").mangledNameHash());
     ASSERT_EQ(0x0000018du, ImmutableString("pow(00B00B").mangledNameHash());
     ASSERT_EQ(0x0000008du, ImmutableString("pow(10B10B").mangledNameHash());
-    ASSERT_EQ(0x000002feu, ImmutableString("pow(20B20B").mangledNameHash());
-    ASSERT_EQ(0x00000217u, ImmutableString("pow(30B30B").mangledNameHash());
-    ASSERT_EQ(0x0000030bu, ImmutableString("exp(00B").mangledNameHash());
+    ASSERT_EQ(0x000002ffu, ImmutableString("pow(20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000218u, ImmutableString("pow(30B30B").mangledNameHash());
+    ASSERT_EQ(0x0000030cu, ImmutableString("exp(00B").mangledNameHash());
     ASSERT_EQ(0x00000077u, ImmutableString("exp(10B").mangledNameHash());
     ASSERT_EQ(0x00000178u, ImmutableString("exp(20B").mangledNameHash());
-    ASSERT_EQ(0x00000295u, ImmutableString("exp(30B").mangledNameHash());
-    ASSERT_EQ(0x0000029cu, ImmutableString("log(00B").mangledNameHash());
+    ASSERT_EQ(0x00000296u, ImmutableString("exp(30B").mangledNameHash());
+    ASSERT_EQ(0x0000029du, ImmutableString("log(00B").mangledNameHash());
     ASSERT_EQ(0x0000017cu, ImmutableString("log(10B").mangledNameHash());
     ASSERT_EQ(0x00000135u, ImmutableString("log(20B").mangledNameHash());
     ASSERT_EQ(0x000000ccu, ImmutableString("log(30B").mangledNameHash());
-    ASSERT_EQ(0x0000039au, ImmutableString("exp2(00B").mangledNameHash());
+    ASSERT_EQ(0x0000039bu, ImmutableString("exp2(00B").mangledNameHash());
     ASSERT_EQ(0x000000f9u, ImmutableString("exp2(10B").mangledNameHash());
     ASSERT_EQ(0x00000144u, ImmutableString("exp2(20B").mangledNameHash());
-    ASSERT_EQ(0x00000258u, ImmutableString("exp2(30B").mangledNameHash());
+    ASSERT_EQ(0x00000259u, ImmutableString("exp2(30B").mangledNameHash());
     ASSERT_EQ(0x00000162u, ImmutableString("log2(00B").mangledNameHash());
     ASSERT_EQ(0x0000008au, ImmutableString("log2(10B").mangledNameHash());
-    ASSERT_EQ(0x00000317u, ImmutableString("log2(20B").mangledNameHash());
+    ASSERT_EQ(0x00000318u, ImmutableString("log2(20B").mangledNameHash());
     ASSERT_EQ(0x000001b3u, ImmutableString("log2(30B").mangledNameHash());
     ASSERT_EQ(0x000001d4u, ImmutableString("sqrt(00B").mangledNameHash());
     ASSERT_EQ(0x000000b8u, ImmutableString("sqrt(10B").mangledNameHash());
     ASSERT_EQ(0x0000007eu, ImmutableString("sqrt(20B").mangledNameHash());
-    ASSERT_EQ(0x00000307u, ImmutableString("sqrt(30B").mangledNameHash());
+    ASSERT_EQ(0x00000308u, ImmutableString("sqrt(30B").mangledNameHash());
     ASSERT_EQ(0x0000004cu, ImmutableString("inversesqrt(00B").mangledNameHash());
-    ASSERT_EQ(0x000002e4u, ImmutableString("inversesqrt(10B").mangledNameHash());
-    ASSERT_EQ(0x0000023eu, ImmutableString("inversesqrt(20B").mangledNameHash());
+    ASSERT_EQ(0x000002e5u, ImmutableString("inversesqrt(10B").mangledNameHash());
+    ASSERT_EQ(0x0000023fu, ImmutableString("inversesqrt(20B").mangledNameHash());
     ASSERT_EQ(0x0000016eu, ImmutableString("inversesqrt(30B").mangledNameHash());
-    ASSERT_EQ(0x00000280u, ImmutableString("abs(00B").mangledNameHash());
+    ASSERT_EQ(0x00000281u, ImmutableString("abs(00B").mangledNameHash());
     ASSERT_EQ(0x00000165u, ImmutableString("abs(10B").mangledNameHash());
     ASSERT_EQ(0x0000004bu, ImmutableString("abs(20B").mangledNameHash());
-    ASSERT_EQ(0x000002eau, ImmutableString("abs(30B").mangledNameHash());
-    ASSERT_EQ(0x0000027fu, ImmutableString("abs(00D").mangledNameHash());
+    ASSERT_EQ(0x000002ebu, ImmutableString("abs(30B").mangledNameHash());
+    ASSERT_EQ(0x00000280u, ImmutableString("abs(00D").mangledNameHash());
     ASSERT_EQ(0x00000164u, ImmutableString("abs(10D").mangledNameHash());
     ASSERT_EQ(0x0000004au, ImmutableString("abs(20D").mangledNameHash());
-    ASSERT_EQ(0x000002e7u, ImmutableString("abs(30D").mangledNameHash());
-    ASSERT_EQ(0x0000029bu, ImmutableString("sign(00B").mangledNameHash());
-    ASSERT_EQ(0x0000038cu, ImmutableString("sign(10B").mangledNameHash());
+    ASSERT_EQ(0x000002e8u, ImmutableString("abs(30D").mangledNameHash());
+    ASSERT_EQ(0x0000029cu, ImmutableString("sign(00B").mangledNameHash());
+    ASSERT_EQ(0x0000038du, ImmutableString("sign(10B").mangledNameHash());
     ASSERT_EQ(0x0000007fu, ImmutableString("sign(20B").mangledNameHash());
     ASSERT_EQ(0x0000018bu, ImmutableString("sign(30B").mangledNameHash());
-    ASSERT_EQ(0x0000029eu, ImmutableString("sign(00D").mangledNameHash());
-    ASSERT_EQ(0x00000309u, ImmutableString("sign(10D").mangledNameHash());
+    ASSERT_EQ(0x0000029fu, ImmutableString("sign(00D").mangledNameHash());
+    ASSERT_EQ(0x0000030au, ImmutableString("sign(10D").mangledNameHash());
     ASSERT_EQ(0x00000081u, ImmutableString("sign(20D").mangledNameHash());
     ASSERT_EQ(0x0000018cu, ImmutableString("sign(30D").mangledNameHash());
-    ASSERT_EQ(0x000003a3u, ImmutableString("floor(00B").mangledNameHash());
-    ASSERT_EQ(0x00000202u, ImmutableString("floor(10B").mangledNameHash());
-    ASSERT_EQ(0x0000021eu, ImmutableString("floor(20B").mangledNameHash());
+    ASSERT_EQ(0x000003a4u, ImmutableString("floor(00B").mangledNameHash());
+    ASSERT_EQ(0x00000203u, ImmutableString("floor(10B").mangledNameHash());
+    ASSERT_EQ(0x0000021fu, ImmutableString("floor(20B").mangledNameHash());
     ASSERT_EQ(0x00000110u, ImmutableString("floor(30B").mangledNameHash());
     ASSERT_EQ(0x000000ebu, ImmutableString("trunc(00B").mangledNameHash());
-    ASSERT_EQ(0x0000037au, ImmutableString("trunc(10B").mangledNameHash());
-    ASSERT_EQ(0x00000343u, ImmutableString("trunc(20B").mangledNameHash());
+    ASSERT_EQ(0x0000037bu, ImmutableString("trunc(10B").mangledNameHash());
+    ASSERT_EQ(0x00000344u, ImmutableString("trunc(20B").mangledNameHash());
     ASSERT_EQ(0x000001f9u, ImmutableString("trunc(30B").mangledNameHash());
     ASSERT_EQ(0x000000d0u, ImmutableString("round(00B").mangledNameHash());
-    ASSERT_EQ(0x00000363u, ImmutableString("round(10B").mangledNameHash());
-    ASSERT_EQ(0x00000226u, ImmutableString("round(20B").mangledNameHash());
+    ASSERT_EQ(0x00000364u, ImmutableString("round(10B").mangledNameHash());
+    ASSERT_EQ(0x00000227u, ImmutableString("round(20B").mangledNameHash());
     ASSERT_EQ(0x0000010cu, ImmutableString("round(30B").mangledNameHash());
-    ASSERT_EQ(0x000002c8u, ImmutableString("roundEven(00B").mangledNameHash());
+    ASSERT_EQ(0x000002c9u, ImmutableString("roundEven(00B").mangledNameHash());
     ASSERT_EQ(0x00000191u, ImmutableString("roundEven(10B").mangledNameHash());
     ASSERT_EQ(0x0000013bu, ImmutableString("roundEven(20B").mangledNameHash());
     ASSERT_EQ(0x0000001cu, ImmutableString("roundEven(30B").mangledNameHash());
-    ASSERT_EQ(0x00000232u, ImmutableString("ceil(00B").mangledNameHash());
-    ASSERT_EQ(0x00000325u, ImmutableString("ceil(10B").mangledNameHash());
+    ASSERT_EQ(0x00000233u, ImmutableString("ceil(00B").mangledNameHash());
+    ASSERT_EQ(0x00000326u, ImmutableString("ceil(10B").mangledNameHash());
     ASSERT_EQ(0x00000098u, ImmutableString("ceil(20B").mangledNameHash());
     ASSERT_EQ(0x0000014bu, ImmutableString("ceil(30B").mangledNameHash());
     ASSERT_EQ(0x00000175u, ImmutableString("fract(00B").mangledNameHash());
     ASSERT_EQ(0x00000061u, ImmutableString("fract(10B").mangledNameHash());
-    ASSERT_EQ(0x000002e9u, ImmutableString("fract(20B").mangledNameHash());
+    ASSERT_EQ(0x000002eau, ImmutableString("fract(20B").mangledNameHash());
     ASSERT_EQ(0x000001b6u, ImmutableString("fract(30B").mangledNameHash());
     ASSERT_EQ(0x0000018eu, ImmutableString("mod(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000154u, ImmutableString("mod(10B00B").mangledNameHash());
     ASSERT_EQ(0x000000b3u, ImmutableString("mod(20B00B").mangledNameHash());
     ASSERT_EQ(0x0000019fu, ImmutableString("mod(30B00B").mangledNameHash());
-    ASSERT_EQ(0x000002aau, ImmutableString("mod(10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000207u, ImmutableString("mod(20B20B").mangledNameHash());
+    ASSERT_EQ(0x000002abu, ImmutableString("mod(10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000208u, ImmutableString("mod(20B20B").mangledNameHash());
     ASSERT_EQ(0x00000189u, ImmutableString("mod(30B30B").mangledNameHash());
     ASSERT_EQ(0x000001d0u, ImmutableString("min(00B00B").mangledNameHash());
-    ASSERT_EQ(0x00000319u, ImmutableString("min(10B00B").mangledNameHash());
+    ASSERT_EQ(0x0000031au, ImmutableString("min(10B00B").mangledNameHash());
     ASSERT_EQ(0x000000aeu, ImmutableString("min(20B00B").mangledNameHash());
     ASSERT_EQ(0x00000072u, ImmutableString("min(30B00B").mangledNameHash());
     ASSERT_EQ(0x0000008bu, ImmutableString("min(10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000210u, ImmutableString("min(20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000211u, ImmutableString("min(20B20B").mangledNameHash());
     ASSERT_EQ(0x0000005bu, ImmutableString("min(30B30B").mangledNameHash());
-    ASSERT_EQ(0x00000340u, ImmutableString("min(00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000341u, ImmutableString("min(00D00D").mangledNameHash());
     ASSERT_EQ(0x00000045u, ImmutableString("min(10D10D").mangledNameHash());
-    ASSERT_EQ(0x00000270u, ImmutableString("min(20D20D").mangledNameHash());
-    ASSERT_EQ(0x00000240u, ImmutableString("min(30D30D").mangledNameHash());
-    ASSERT_EQ(0x000002c3u, ImmutableString("min(10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000271u, ImmutableString("min(20D20D").mangledNameHash());
+    ASSERT_EQ(0x00000241u, ImmutableString("min(30D30D").mangledNameHash());
+    ASSERT_EQ(0x000002c4u, ImmutableString("min(10D00D").mangledNameHash());
     ASSERT_EQ(0x00000039u, ImmutableString("min(20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000038au, ImmutableString("min(30D00D").mangledNameHash());
-    ASSERT_EQ(0x0000030cu, ImmutableString("min(00E00E").mangledNameHash());
-    ASSERT_EQ(0x0000035cu, ImmutableString("min(10E10E").mangledNameHash());
+    ASSERT_EQ(0x0000038bu, ImmutableString("min(30D00D").mangledNameHash());
+    ASSERT_EQ(0x0000030du, ImmutableString("min(00E00E").mangledNameHash());
+    ASSERT_EQ(0x0000035du, ImmutableString("min(10E10E").mangledNameHash());
     ASSERT_EQ(0x00000017u, ImmutableString("min(20E20E").mangledNameHash());
     ASSERT_EQ(0x000001ccu, ImmutableString("min(30E30E").mangledNameHash());
     ASSERT_EQ(0x000000cbu, ImmutableString("min(10E00E").mangledNameHash());
     ASSERT_EQ(0x000001dau, ImmutableString("min(20E00E").mangledNameHash());
     ASSERT_EQ(0x00000177u, ImmutableString("min(30E00E").mangledNameHash());
     ASSERT_EQ(0x0000013au, ImmutableString("max(00B00B").mangledNameHash());
-    ASSERT_EQ(0x00000251u, ImmutableString("max(10B00B").mangledNameHash());
+    ASSERT_EQ(0x00000252u, ImmutableString("max(10B00B").mangledNameHash());
     ASSERT_EQ(0x00000032u, ImmutableString("max(20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000026fu, ImmutableString("max(30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000372u, ImmutableString("max(10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000290u, ImmutableString("max(20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000270u, ImmutableString("max(30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000373u, ImmutableString("max(10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000291u, ImmutableString("max(20B20B").mangledNameHash());
     ASSERT_EQ(0x0000011cu, ImmutableString("max(30B30B").mangledNameHash());
     ASSERT_EQ(0x00000149u, ImmutableString("max(00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000214u, ImmutableString("max(10D10D").mangledNameHash());
-    ASSERT_EQ(0x00000212u, ImmutableString("max(20D20D").mangledNameHash());
-    ASSERT_EQ(0x0000030du, ImmutableString("max(30D30D").mangledNameHash());
+    ASSERT_EQ(0x00000215u, ImmutableString("max(10D10D").mangledNameHash());
+    ASSERT_EQ(0x00000213u, ImmutableString("max(20D20D").mangledNameHash());
+    ASSERT_EQ(0x0000030eu, ImmutableString("max(30D30D").mangledNameHash());
     ASSERT_EQ(0x0000010au, ImmutableString("max(10D00D").mangledNameHash());
     ASSERT_EQ(0x000000bcu, ImmutableString("max(20D00D").mangledNameHash());
     ASSERT_EQ(0x00000053u, ImmutableString("max(30D00D").mangledNameHash());
-    ASSERT_EQ(0x0000038du, ImmutableString("max(00E00E").mangledNameHash());
+    ASSERT_EQ(0x0000038eu, ImmutableString("max(00E00E").mangledNameHash());
     ASSERT_EQ(0x0000011bu, ImmutableString("max(10E10E").mangledNameHash());
     ASSERT_EQ(0x0000015bu, ImmutableString("max(20E20E").mangledNameHash());
     ASSERT_EQ(0x000001c3u, ImmutableString("max(30E30E").mangledNameHash());
     ASSERT_EQ(0x000001e9u, ImmutableString("max(10E00E").mangledNameHash());
-    ASSERT_EQ(0x000002c6u, ImmutableString("max(20E00E").mangledNameHash());
+    ASSERT_EQ(0x000002c7u, ImmutableString("max(20E00E").mangledNameHash());
     ASSERT_EQ(0x00000143u, ImmutableString("max(30E00E").mangledNameHash());
     ASSERT_EQ(0x00000171u, ImmutableString("clamp(00B00B00B").mangledNameHash());
-    ASSERT_EQ(0x00000383u, ImmutableString("clamp(10B00B00B").mangledNameHash());
-    ASSERT_EQ(0x0000027bu, ImmutableString("clamp(20B00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000384u, ImmutableString("clamp(10B00B00B").mangledNameHash());
+    ASSERT_EQ(0x0000027cu, ImmutableString("clamp(20B00B00B").mangledNameHash());
     ASSERT_EQ(0x00000100u, ImmutableString("clamp(30B00B00B").mangledNameHash());
     ASSERT_EQ(0x00000020u, ImmutableString("clamp(10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000033au, ImmutableString("clamp(20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000033bu, ImmutableString("clamp(20B20B20B").mangledNameHash());
     ASSERT_EQ(0x00000033u, ImmutableString("clamp(30B30B30B").mangledNameHash());
     ASSERT_EQ(0x0000010eu, ImmutableString("clamp(00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000002u, ImmutableString("clamp(10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000002cdu, ImmutableString("clamp(20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000382u, ImmutableString("clamp(30D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000002ceu, ImmutableString("clamp(20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000383u, ImmutableString("clamp(30D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000009au, ImmutableString("clamp(10D10D10D").mangledNameHash());
     ASSERT_EQ(0x000001e6u, ImmutableString("clamp(20D20D20D").mangledNameHash());
-    ASSERT_EQ(0x000002f1u, ImmutableString("clamp(30D30D30D").mangledNameHash());
+    ASSERT_EQ(0x000002f2u, ImmutableString("clamp(30D30D30D").mangledNameHash());
     ASSERT_EQ(0x00000011u, ImmutableString("clamp(00E00E00E").mangledNameHash());
-    ASSERT_EQ(0x000002ccu, ImmutableString("clamp(10E00E00E").mangledNameHash());
-    ASSERT_EQ(0x000002f8u, ImmutableString("clamp(20E00E00E").mangledNameHash());
-    ASSERT_EQ(0x00000230u, ImmutableString("clamp(30E00E00E").mangledNameHash());
+    ASSERT_EQ(0x000002cdu, ImmutableString("clamp(10E00E00E").mangledNameHash());
+    ASSERT_EQ(0x000002f9u, ImmutableString("clamp(20E00E00E").mangledNameHash());
+    ASSERT_EQ(0x00000231u, ImmutableString("clamp(30E00E00E").mangledNameHash());
     ASSERT_EQ(0x0000011du, ImmutableString("clamp(10E10E10E").mangledNameHash());
     ASSERT_EQ(0x000000bau, ImmutableString("clamp(20E20E20E").mangledNameHash());
     ASSERT_EQ(0x000000a3u, ImmutableString("clamp(30E30E30E").mangledNameHash());
-    ASSERT_EQ(0x00000220u, ImmutableString("mix(00B00B00B").mangledNameHash());
-    ASSERT_EQ(0x000002efu, ImmutableString("mix(10B10B00B").mangledNameHash());
+    ASSERT_EQ(0x00000221u, ImmutableString("mix(00B00B00B").mangledNameHash());
+    ASSERT_EQ(0x000002f0u, ImmutableString("mix(10B10B00B").mangledNameHash());
     ASSERT_EQ(0x0000001fu, ImmutableString("mix(20B20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000031au, ImmutableString("mix(30B30B00B").mangledNameHash());
+    ASSERT_EQ(0x0000031bu, ImmutableString("mix(30B30B00B").mangledNameHash());
     ASSERT_EQ(0x000001afu, ImmutableString("mix(10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000024fu, ImmutableString("mix(20B20B20B").mangledNameHash());
-    ASSERT_EQ(0x00000357u, ImmutableString("mix(30B30B30B").mangledNameHash());
+    ASSERT_EQ(0x00000250u, ImmutableString("mix(20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000358u, ImmutableString("mix(30B30B30B").mangledNameHash());
     ASSERT_EQ(0x00000055u, ImmutableString("mix(00B00B00F").mangledNameHash());
     ASSERT_EQ(0x000001aeu, ImmutableString("mix(10B10B10F").mangledNameHash());
-    ASSERT_EQ(0x0000024cu, ImmutableString("mix(20B20B20F").mangledNameHash());
-    ASSERT_EQ(0x000002fbu, ImmutableString("mix(30B30B30F").mangledNameHash());
+    ASSERT_EQ(0x0000024du, ImmutableString("mix(20B20B20F").mangledNameHash());
+    ASSERT_EQ(0x000002fcu, ImmutableString("mix(30B30B30F").mangledNameHash());
     ASSERT_EQ(0x00000197u, ImmutableString("step(00B00B").mangledNameHash());
-    ASSERT_EQ(0x00000271u, ImmutableString("step(10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000282u, ImmutableString("step(20B20B").mangledNameHash());
-    ASSERT_EQ(0x00000273u, ImmutableString("step(30B30B").mangledNameHash());
+    ASSERT_EQ(0x00000272u, ImmutableString("step(10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000283u, ImmutableString("step(20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000274u, ImmutableString("step(30B30B").mangledNameHash());
     ASSERT_EQ(0x00000079u, ImmutableString("step(00B10B").mangledNameHash());
     ASSERT_EQ(0x00000024u, ImmutableString("step(00B20B").mangledNameHash());
-    ASSERT_EQ(0x00000298u, ImmutableString("step(00B30B").mangledNameHash());
-    ASSERT_EQ(0x00000332u, ImmutableString("smoothstep(00B00B00B").mangledNameHash());
-    ASSERT_EQ(0x00000219u, ImmutableString("smoothstep(10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000390u, ImmutableString("smoothstep(20B20B20B").mangledNameHash());
-    ASSERT_EQ(0x00000338u, ImmutableString("smoothstep(30B30B30B").mangledNameHash());
+    ASSERT_EQ(0x00000299u, ImmutableString("step(00B30B").mangledNameHash());
+    ASSERT_EQ(0x00000333u, ImmutableString("smoothstep(00B00B00B").mangledNameHash());
+    ASSERT_EQ(0x0000021au, ImmutableString("smoothstep(10B10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000391u, ImmutableString("smoothstep(20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000339u, ImmutableString("smoothstep(30B30B30B").mangledNameHash());
     ASSERT_EQ(0x000001eau, ImmutableString("smoothstep(00B00B10B").mangledNameHash());
     ASSERT_EQ(0x000000d1u, ImmutableString("smoothstep(00B00B20B").mangledNameHash());
-    ASSERT_EQ(0x00000314u, ImmutableString("smoothstep(00B00B30B").mangledNameHash());
+    ASSERT_EQ(0x00000315u, ImmutableString("smoothstep(00B00B30B").mangledNameHash());
     ASSERT_EQ(0x00000005u, ImmutableString("modf(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000071u, ImmutableString("modf(10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000239u, ImmutableString("modf(20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000023au, ImmutableString("modf(20B20B").mangledNameHash());
     ASSERT_EQ(0x00000138u, ImmutableString("modf(30B30B").mangledNameHash());
-    ASSERT_EQ(0x0000022cu, ImmutableString("isnan(00B").mangledNameHash());
-    ASSERT_EQ(0x00000370u, ImmutableString("isnan(10B").mangledNameHash());
+    ASSERT_EQ(0x0000022du, ImmutableString("isnan(00B").mangledNameHash());
+    ASSERT_EQ(0x00000371u, ImmutableString("isnan(10B").mangledNameHash());
     ASSERT_EQ(0x00000139u, ImmutableString("isnan(20B").mangledNameHash());
     ASSERT_EQ(0x000001c4u, ImmutableString("isnan(30B").mangledNameHash());
     ASSERT_EQ(0x0000019au, ImmutableString("isinf(00B").mangledNameHash());
-    ASSERT_EQ(0x000002cfu, ImmutableString("isinf(10B").mangledNameHash());
-    ASSERT_EQ(0x00000355u, ImmutableString("isinf(20B").mangledNameHash());
+    ASSERT_EQ(0x000002d0u, ImmutableString("isinf(10B").mangledNameHash());
+    ASSERT_EQ(0x00000356u, ImmutableString("isinf(20B").mangledNameHash());
     ASSERT_EQ(0x000000c1u, ImmutableString("isinf(30B").mangledNameHash());
-    ASSERT_EQ(0x0000038bu, ImmutableString("floatBitsToInt(00B").mangledNameHash());
-    ASSERT_EQ(0x00000250u, ImmutableString("floatBitsToInt(10B").mangledNameHash());
-    ASSERT_EQ(0x00000315u, ImmutableString("floatBitsToInt(20B").mangledNameHash());
+    ASSERT_EQ(0x0000038cu, ImmutableString("floatBitsToInt(00B").mangledNameHash());
+    ASSERT_EQ(0x00000251u, ImmutableString("floatBitsToInt(10B").mangledNameHash());
+    ASSERT_EQ(0x00000316u, ImmutableString("floatBitsToInt(20B").mangledNameHash());
     ASSERT_EQ(0x00000140u, ImmutableString("floatBitsToInt(30B").mangledNameHash());
-    ASSERT_EQ(0x00000395u, ImmutableString("floatBitsToUint(00B").mangledNameHash());
+    ASSERT_EQ(0x00000396u, ImmutableString("floatBitsToUint(00B").mangledNameHash());
     ASSERT_EQ(0x000000b6u, ImmutableString("floatBitsToUint(10B").mangledNameHash());
     ASSERT_EQ(0x00000041u, ImmutableString("floatBitsToUint(20B").mangledNameHash());
-    ASSERT_EQ(0x0000025du, ImmutableString("floatBitsToUint(30B").mangledNameHash());
+    ASSERT_EQ(0x0000025eu, ImmutableString("floatBitsToUint(30B").mangledNameHash());
     ASSERT_EQ(0x00000063u, ImmutableString("intBitsToFloat(00D").mangledNameHash());
     ASSERT_EQ(0x000001a7u, ImmutableString("intBitsToFloat(10D").mangledNameHash());
     ASSERT_EQ(0x00000174u, ImmutableString("intBitsToFloat(20D").mangledNameHash());
     ASSERT_EQ(0x00000058u, ImmutableString("intBitsToFloat(30D").mangledNameHash());
     ASSERT_EQ(0x0000003bu, ImmutableString("uintBitsToFloat(00E").mangledNameHash());
     ASSERT_EQ(0x00000155u, ImmutableString("uintBitsToFloat(10E").mangledNameHash());
-    ASSERT_EQ(0x000002a6u, ImmutableString("uintBitsToFloat(20E").mangledNameHash());
+    ASSERT_EQ(0x000002a7u, ImmutableString("uintBitsToFloat(20E").mangledNameHash());
     ASSERT_EQ(0x00000026u, ImmutableString("uintBitsToFloat(30E").mangledNameHash());
     ASSERT_EQ(0x00000093u, ImmutableString("frexp(00B00D").mangledNameHash());
     ASSERT_EQ(0x000001e8u, ImmutableString("frexp(10B10D").mangledNameHash());
     ASSERT_EQ(0x00000173u, ImmutableString("frexp(20B20D").mangledNameHash());
     ASSERT_EQ(0x000001cau, ImmutableString("frexp(30B30D").mangledNameHash());
     ASSERT_EQ(0x00000013u, ImmutableString("ldexp(00B00D").mangledNameHash());
-    ASSERT_EQ(0x00000318u, ImmutableString("ldexp(10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000350u, ImmutableString("ldexp(20B20D").mangledNameHash());
-    ASSERT_EQ(0x0000026eu, ImmutableString("ldexp(30B30D").mangledNameHash());
-    ASSERT_EQ(0x0000025cu, ImmutableString("packSnorm2x16(10B").mangledNameHash());
-    ASSERT_EQ(0x000002d4u, ImmutableString("packHalf2x16(10B").mangledNameHash());
+    ASSERT_EQ(0x00000319u, ImmutableString("ldexp(10B10D").mangledNameHash());
+    ASSERT_EQ(0x00000351u, ImmutableString("ldexp(20B20D").mangledNameHash());
+    ASSERT_EQ(0x0000026fu, ImmutableString("ldexp(30B30D").mangledNameHash());
+    ASSERT_EQ(0x0000025du, ImmutableString("packSnorm2x16(10B").mangledNameHash());
+    ASSERT_EQ(0x000002d5u, ImmutableString("packHalf2x16(10B").mangledNameHash());
     ASSERT_EQ(0x000001efu, ImmutableString("unpackSnorm2x16(00E").mangledNameHash());
     ASSERT_EQ(0x00000103u, ImmutableString("unpackHalf2x16(00E").mangledNameHash());
-    ASSERT_EQ(0x000002afu, ImmutableString("packUnorm2x16(10B").mangledNameHash());
+    ASSERT_EQ(0x000002b0u, ImmutableString("packUnorm2x16(10B").mangledNameHash());
     ASSERT_EQ(0x0000007cu, ImmutableString("unpackUnorm2x16(00E").mangledNameHash());
     ASSERT_EQ(0x00000091u, ImmutableString("packUnorm4x8(30B").mangledNameHash());
-    ASSERT_EQ(0x000002eeu, ImmutableString("packSnorm4x8(30B").mangledNameHash());
-    ASSERT_EQ(0x000002a7u, ImmutableString("unpackUnorm4x8(00E").mangledNameHash());
+    ASSERT_EQ(0x000002efu, ImmutableString("packSnorm4x8(30B").mangledNameHash());
+    ASSERT_EQ(0x000002a8u, ImmutableString("unpackUnorm4x8(00E").mangledNameHash());
     ASSERT_EQ(0x00000132u, ImmutableString("unpackSnorm4x8(00E").mangledNameHash());
     ASSERT_EQ(0x000001fbu, ImmutableString("length(00B").mangledNameHash());
     ASSERT_EQ(0x000000edu, ImmutableString("length(10B").mangledNameHash());
-    ASSERT_EQ(0x0000037eu, ImmutableString("length(20B").mangledNameHash());
-    ASSERT_EQ(0x00000248u, ImmutableString("length(30B").mangledNameHash());
-    ASSERT_EQ(0x00000234u, ImmutableString("distance(00B00B").mangledNameHash());
+    ASSERT_EQ(0x0000037fu, ImmutableString("length(20B").mangledNameHash());
+    ASSERT_EQ(0x00000249u, ImmutableString("length(30B").mangledNameHash());
+    ASSERT_EQ(0x00000235u, ImmutableString("distance(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000152u, ImmutableString("distance(10B10B").mangledNameHash());
     ASSERT_EQ(0x0000019cu, ImmutableString("distance(20B20B").mangledNameHash());
     ASSERT_EQ(0x000000e7u, ImmutableString("distance(30B30B").mangledNameHash());
     ASSERT_EQ(0x000000f0u, ImmutableString("dot(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000102u, ImmutableString("dot(10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000032bu, ImmutableString("dot(20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000032cu, ImmutableString("dot(20B20B").mangledNameHash());
     ASSERT_EQ(0x000000f2u, ImmutableString("dot(30B30B").mangledNameHash());
-    ASSERT_EQ(0x00000279u, ImmutableString("cross(20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000027au, ImmutableString("cross(20B20B").mangledNameHash());
     ASSERT_EQ(0x000000a7u, ImmutableString("normalize(00B").mangledNameHash());
     ASSERT_EQ(0x000001eeu, ImmutableString("normalize(10B").mangledNameHash());
     ASSERT_EQ(0x000001d5u, ImmutableString("normalize(20B").mangledNameHash());
-    ASSERT_EQ(0x00000337u, ImmutableString("normalize(30B").mangledNameHash());
-    ASSERT_EQ(0x000002b0u, ImmutableString("faceforward(00B00B00B").mangledNameHash());
-    ASSERT_EQ(0x000002bbu, ImmutableString("faceforward(10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000286u, ImmutableString("faceforward(20B20B20B").mangledNameHash());
-    ASSERT_EQ(0x0000022eu, ImmutableString("faceforward(30B30B30B").mangledNameHash());
+    ASSERT_EQ(0x00000338u, ImmutableString("normalize(30B").mangledNameHash());
+    ASSERT_EQ(0x000002b1u, ImmutableString("faceforward(00B00B00B").mangledNameHash());
+    ASSERT_EQ(0x000002bcu, ImmutableString("faceforward(10B10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000287u, ImmutableString("faceforward(20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000022fu, ImmutableString("faceforward(30B30B30B").mangledNameHash());
     ASSERT_EQ(0x000000b2u, ImmutableString("reflect(00B00B").mangledNameHash());
     ASSERT_EQ(0x000000b5u, ImmutableString("reflect(10B10B").mangledNameHash());
     ASSERT_EQ(0x00000153u, ImmutableString("reflect(20B20B").mangledNameHash());
@@ -313,327 +313,327 @@
     ASSERT_EQ(0x000001abu, ImmutableString("refract(00B00B00B").mangledNameHash());
     ASSERT_EQ(0x000000d9u, ImmutableString("refract(10B10B00B").mangledNameHash());
     ASSERT_EQ(0x000001a9u, ImmutableString("refract(20B20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000021cu, ImmutableString("refract(30B30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000367u, ImmutableString("matrixCompMult(50B50B").mangledNameHash());
+    ASSERT_EQ(0x0000021du, ImmutableString("refract(30B30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000368u, ImmutableString("matrixCompMult(50B50B").mangledNameHash());
     ASSERT_EQ(0x00000104u, ImmutableString("matrixCompMult(A0BA0B").mangledNameHash());
-    ASSERT_EQ(0x0000027eu, ImmutableString("matrixCompMult(F0BF0B").mangledNameHash());
-    ASSERT_EQ(0x00000227u, ImmutableString("matrixCompMult(90B90B").mangledNameHash());
+    ASSERT_EQ(0x0000027fu, ImmutableString("matrixCompMult(F0BF0B").mangledNameHash());
+    ASSERT_EQ(0x00000228u, ImmutableString("matrixCompMult(90B90B").mangledNameHash());
     ASSERT_EQ(0x000001ecu, ImmutableString("matrixCompMult(60B60B").mangledNameHash());
     ASSERT_EQ(0x0000004du, ImmutableString("matrixCompMult(D0BD0B").mangledNameHash());
     ASSERT_EQ(0x0000015cu, ImmutableString("matrixCompMult(70B70B").mangledNameHash());
     ASSERT_EQ(0x000001fau, ImmutableString("matrixCompMult(E0BE0B").mangledNameHash());
-    ASSERT_EQ(0x00000277u, ImmutableString("matrixCompMult(B0BB0B").mangledNameHash());
-    ASSERT_EQ(0x00000341u, ImmutableString("outerProduct(10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000278u, ImmutableString("matrixCompMult(B0BB0B").mangledNameHash());
+    ASSERT_EQ(0x00000342u, ImmutableString("outerProduct(10B10B").mangledNameHash());
     ASSERT_EQ(0x00000130u, ImmutableString("outerProduct(20B20B").mangledNameHash());
-    ASSERT_EQ(0x00000292u, ImmutableString("outerProduct(30B30B").mangledNameHash());
+    ASSERT_EQ(0x00000293u, ImmutableString("outerProduct(30B30B").mangledNameHash());
     ASSERT_EQ(0x00000184u, ImmutableString("outerProduct(20B10B").mangledNameHash());
     ASSERT_EQ(0x000000fcu, ImmutableString("outerProduct(10B20B").mangledNameHash());
     ASSERT_EQ(0x0000013fu, ImmutableString("outerProduct(30B10B").mangledNameHash());
-    ASSERT_EQ(0x0000020bu, ImmutableString("outerProduct(10B30B").mangledNameHash());
+    ASSERT_EQ(0x0000020cu, ImmutableString("outerProduct(10B30B").mangledNameHash());
     ASSERT_EQ(0x00000181u, ImmutableString("outerProduct(30B20B").mangledNameHash());
     ASSERT_EQ(0x00000019u, ImmutableString("outerProduct(20B30B").mangledNameHash());
     ASSERT_EQ(0x00000012u, ImmutableString("transpose(50B").mangledNameHash());
-    ASSERT_EQ(0x000002fdu, ImmutableString("transpose(A0B").mangledNameHash());
+    ASSERT_EQ(0x000002feu, ImmutableString("transpose(A0B").mangledNameHash());
     ASSERT_EQ(0x0000009du, ImmutableString("transpose(F0B").mangledNameHash());
-    ASSERT_EQ(0x000002a0u, ImmutableString("transpose(60B").mangledNameHash());
-    ASSERT_EQ(0x0000032cu, ImmutableString("transpose(90B").mangledNameHash());
+    ASSERT_EQ(0x000002a1u, ImmutableString("transpose(60B").mangledNameHash());
+    ASSERT_EQ(0x0000032du, ImmutableString("transpose(90B").mangledNameHash());
     ASSERT_EQ(0x0000002au, ImmutableString("transpose(70B").mangledNameHash());
     ASSERT_EQ(0x000001b2u, ImmutableString("transpose(D0B").mangledNameHash());
-    ASSERT_EQ(0x00000311u, ImmutableString("transpose(B0B").mangledNameHash());
+    ASSERT_EQ(0x00000312u, ImmutableString("transpose(B0B").mangledNameHash());
     ASSERT_EQ(0x00000062u, ImmutableString("transpose(E0B").mangledNameHash());
     ASSERT_EQ(0x00000073u, ImmutableString("determinant(50B").mangledNameHash());
     ASSERT_EQ(0x0000000bu, ImmutableString("determinant(A0B").mangledNameHash());
-    ASSERT_EQ(0x000002fcu, ImmutableString("determinant(F0B").mangledNameHash());
+    ASSERT_EQ(0x000002fdu, ImmutableString("determinant(F0B").mangledNameHash());
     ASSERT_EQ(0x00000101u, ImmutableString("inverse(50B").mangledNameHash());
     ASSERT_EQ(0x000001c0u, ImmutableString("inverse(A0B").mangledNameHash());
     ASSERT_EQ(0x000001d9u, ImmutableString("inverse(F0B").mangledNameHash());
-    ASSERT_EQ(0x000002ebu, ImmutableString("lessThan(10B10B").mangledNameHash());
+    ASSERT_EQ(0x000002ecu, ImmutableString("lessThan(10B10B").mangledNameHash());
     ASSERT_EQ(0x00000074u, ImmutableString("lessThan(20B20B").mangledNameHash());
     ASSERT_EQ(0x000000c3u, ImmutableString("lessThan(30B30B").mangledNameHash());
     ASSERT_EQ(0x00000124u, ImmutableString("lessThan(10D10D").mangledNameHash());
     ASSERT_EQ(0x000000b4u, ImmutableString("lessThan(20D20D").mangledNameHash());
     ASSERT_EQ(0x000001f1u, ImmutableString("lessThan(30D30D").mangledNameHash());
     ASSERT_EQ(0x00000097u, ImmutableString("lessThan(10E10E").mangledNameHash());
-    ASSERT_EQ(0x00000278u, ImmutableString("lessThan(20E20E").mangledNameHash());
+    ASSERT_EQ(0x00000279u, ImmutableString("lessThan(20E20E").mangledNameHash());
     ASSERT_EQ(0x00000025u, ImmutableString("lessThan(30E30E").mangledNameHash());
     ASSERT_EQ(0x0000004eu, ImmutableString("lessThanEqual(10B10B").mangledNameHash());
     ASSERT_EQ(0x0000003cu, ImmutableString("lessThanEqual(20B20B").mangledNameHash());
     ASSERT_EQ(0x00000015u, ImmutableString("lessThanEqual(30B30B").mangledNameHash());
-    ASSERT_EQ(0x00000342u, ImmutableString("lessThanEqual(10D10D").mangledNameHash());
-    ASSERT_EQ(0x00000303u, ImmutableString("lessThanEqual(20D20D").mangledNameHash());
-    ASSERT_EQ(0x0000025eu, ImmutableString("lessThanEqual(30D30D").mangledNameHash());
-    ASSERT_EQ(0x0000023du, ImmutableString("lessThanEqual(10E10E").mangledNameHash());
-    ASSERT_EQ(0x00000293u, ImmutableString("lessThanEqual(20E20E").mangledNameHash());
+    ASSERT_EQ(0x00000343u, ImmutableString("lessThanEqual(10D10D").mangledNameHash());
+    ASSERT_EQ(0x00000304u, ImmutableString("lessThanEqual(20D20D").mangledNameHash());
+    ASSERT_EQ(0x0000025fu, ImmutableString("lessThanEqual(30D30D").mangledNameHash());
+    ASSERT_EQ(0x0000023eu, ImmutableString("lessThanEqual(10E10E").mangledNameHash());
+    ASSERT_EQ(0x00000294u, ImmutableString("lessThanEqual(20E20E").mangledNameHash());
     ASSERT_EQ(0x000000c9u, ImmutableString("lessThanEqual(30E30E").mangledNameHash());
-    ASSERT_EQ(0x00000377u, ImmutableString("greaterThan(10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000378u, ImmutableString("greaterThan(10B10B").mangledNameHash());
     ASSERT_EQ(0x00000069u, ImmutableString("greaterThan(20B20B").mangledNameHash());
     ASSERT_EQ(0x000000eau, ImmutableString("greaterThan(30B30B").mangledNameHash());
     ASSERT_EQ(0x000000dcu, ImmutableString("greaterThan(10D10D").mangledNameHash());
     ASSERT_EQ(0x000000e8u, ImmutableString("greaterThan(20D20D").mangledNameHash());
     ASSERT_EQ(0x000000dbu, ImmutableString("greaterThan(30D30D").mangledNameHash());
-    ASSERT_EQ(0x00000387u, ImmutableString("greaterThan(10E10E").mangledNameHash());
+    ASSERT_EQ(0x00000388u, ImmutableString("greaterThan(10E10E").mangledNameHash());
     ASSERT_EQ(0x000001a4u, ImmutableString("greaterThan(20E20E").mangledNameHash());
     ASSERT_EQ(0x000001e7u, ImmutableString("greaterThan(30E30E").mangledNameHash());
-    ASSERT_EQ(0x00000328u, ImmutableString("greaterThanEqual(10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000222u, ImmutableString("greaterThanEqual(20B20B").mangledNameHash());
-    ASSERT_EQ(0x000002dau, ImmutableString("greaterThanEqual(30B30B").mangledNameHash());
+    ASSERT_EQ(0x00000329u, ImmutableString("greaterThanEqual(10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000223u, ImmutableString("greaterThanEqual(20B20B").mangledNameHash());
+    ASSERT_EQ(0x000002dbu, ImmutableString("greaterThanEqual(30B30B").mangledNameHash());
     ASSERT_EQ(0x0000015fu, ImmutableString("greaterThanEqual(10D10D").mangledNameHash());
     ASSERT_EQ(0x00000016u, ImmutableString("greaterThanEqual(20D20D").mangledNameHash());
-    ASSERT_EQ(0x00000351u, ImmutableString("greaterThanEqual(30D30D").mangledNameHash());
-    ASSERT_EQ(0x00000263u, ImmutableString("greaterThanEqual(10E10E").mangledNameHash());
+    ASSERT_EQ(0x00000352u, ImmutableString("greaterThanEqual(30D30D").mangledNameHash());
+    ASSERT_EQ(0x00000264u, ImmutableString("greaterThanEqual(10E10E").mangledNameHash());
     ASSERT_EQ(0x00000123u, ImmutableString("greaterThanEqual(20E20E").mangledNameHash());
-    ASSERT_EQ(0x00000249u, ImmutableString("greaterThanEqual(30E30E").mangledNameHash());
-    ASSERT_EQ(0x0000036du, ImmutableString("equal(10B10B").mangledNameHash());
+    ASSERT_EQ(0x0000024au, ImmutableString("greaterThanEqual(30E30E").mangledNameHash());
+    ASSERT_EQ(0x0000036eu, ImmutableString("equal(10B10B").mangledNameHash());
     ASSERT_EQ(0x00000179u, ImmutableString("equal(20B20B").mangledNameHash());
-    ASSERT_EQ(0x0000036au, ImmutableString("equal(30B30B").mangledNameHash());
+    ASSERT_EQ(0x0000036bu, ImmutableString("equal(30B30B").mangledNameHash());
     ASSERT_EQ(0x00000052u, ImmutableString("equal(10D10D").mangledNameHash());
-    ASSERT_EQ(0x000002b8u, ImmutableString("equal(20D20D").mangledNameHash());
-    ASSERT_EQ(0x0000025au, ImmutableString("equal(30D30D").mangledNameHash());
-    ASSERT_EQ(0x0000035bu, ImmutableString("equal(10E10E").mangledNameHash());
-    ASSERT_EQ(0x0000021fu, ImmutableString("equal(20E20E").mangledNameHash());
-    ASSERT_EQ(0x0000029au, ImmutableString("equal(30E30E").mangledNameHash());
+    ASSERT_EQ(0x000002b9u, ImmutableString("equal(20D20D").mangledNameHash());
+    ASSERT_EQ(0x0000025bu, ImmutableString("equal(30D30D").mangledNameHash());
+    ASSERT_EQ(0x0000035cu, ImmutableString("equal(10E10E").mangledNameHash());
+    ASSERT_EQ(0x00000220u, ImmutableString("equal(20E20E").mangledNameHash());
+    ASSERT_EQ(0x0000029bu, ImmutableString("equal(30E30E").mangledNameHash());
     ASSERT_EQ(0x00000157u, ImmutableString("equal(10F10F").mangledNameHash());
-    ASSERT_EQ(0x00000368u, ImmutableString("equal(20F20F").mangledNameHash());
-    ASSERT_EQ(0x000002deu, ImmutableString("equal(30F30F").mangledNameHash());
+    ASSERT_EQ(0x00000369u, ImmutableString("equal(20F20F").mangledNameHash());
+    ASSERT_EQ(0x000002dfu, ImmutableString("equal(30F30F").mangledNameHash());
     ASSERT_EQ(0x000001f5u, ImmutableString("notEqual(10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000352u, ImmutableString("notEqual(20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000353u, ImmutableString("notEqual(20B20B").mangledNameHash());
     ASSERT_EQ(0x00000190u, ImmutableString("notEqual(30B30B").mangledNameHash());
-    ASSERT_EQ(0x000002acu, ImmutableString("notEqual(10D10D").mangledNameHash());
+    ASSERT_EQ(0x000002adu, ImmutableString("notEqual(10D10D").mangledNameHash());
     ASSERT_EQ(0x00000007u, ImmutableString("notEqual(20D20D").mangledNameHash());
     ASSERT_EQ(0x000000d8u, ImmutableString("notEqual(30D30D").mangledNameHash());
-    ASSERT_EQ(0x00000365u, ImmutableString("notEqual(10E10E").mangledNameHash());
+    ASSERT_EQ(0x00000366u, ImmutableString("notEqual(10E10E").mangledNameHash());
     ASSERT_EQ(0x000001beu, ImmutableString("notEqual(20E20E").mangledNameHash());
-    ASSERT_EQ(0x0000023bu, ImmutableString("notEqual(30E30E").mangledNameHash());
-    ASSERT_EQ(0x0000032fu, ImmutableString("notEqual(10F10F").mangledNameHash());
+    ASSERT_EQ(0x0000023cu, ImmutableString("notEqual(30E30E").mangledNameHash());
+    ASSERT_EQ(0x00000330u, ImmutableString("notEqual(10F10F").mangledNameHash());
     ASSERT_EQ(0x00000188u, ImmutableString("notEqual(20F20F").mangledNameHash());
-    ASSERT_EQ(0x000002e1u, ImmutableString("notEqual(30F30F").mangledNameHash());
-    ASSERT_EQ(0x00000254u, ImmutableString("any(10F").mangledNameHash());
+    ASSERT_EQ(0x000002e2u, ImmutableString("notEqual(30F30F").mangledNameHash());
+    ASSERT_EQ(0x00000255u, ImmutableString("any(10F").mangledNameHash());
     ASSERT_EQ(0x000001fcu, ImmutableString("any(20F").mangledNameHash());
     ASSERT_EQ(0x000000e6u, ImmutableString("any(30F").mangledNameHash());
-    ASSERT_EQ(0x0000027au, ImmutableString("all(10F").mangledNameHash());
-    ASSERT_EQ(0x000002ceu, ImmutableString("all(20F").mangledNameHash());
+    ASSERT_EQ(0x0000027bu, ImmutableString("all(10F").mangledNameHash());
+    ASSERT_EQ(0x000002cfu, ImmutableString("all(20F").mangledNameHash());
     ASSERT_EQ(0x00000049u, ImmutableString("all(30F").mangledNameHash());
     ASSERT_EQ(0x00000095u, ImmutableString("not(10F").mangledNameHash());
     ASSERT_EQ(0x00000129u, ImmutableString("not(20F").mangledNameHash());
-    ASSERT_EQ(0x0000032du, ImmutableString("not(30F").mangledNameHash());
-    ASSERT_EQ(0x000002dfu, ImmutableString("bitfieldExtract(00D00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000032eu, ImmutableString("not(30F").mangledNameHash());
+    ASSERT_EQ(0x000002e0u, ImmutableString("bitfieldExtract(00D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000018au, ImmutableString("bitfieldExtract(10D00D00D").mangledNameHash());
     ASSERT_EQ(0x000001f3u, ImmutableString("bitfieldExtract(20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000002c2u, ImmutableString("bitfieldExtract(30D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000002c3u, ImmutableString("bitfieldExtract(30D00D00D").mangledNameHash());
     ASSERT_EQ(0x000001f7u, ImmutableString("bitfieldExtract(00E00D00D").mangledNameHash());
     ASSERT_EQ(0x000000dfu, ImmutableString("bitfieldExtract(10E00D00D").mangledNameHash());
-    ASSERT_EQ(0x000002a5u, ImmutableString("bitfieldExtract(20E00D00D").mangledNameHash());
+    ASSERT_EQ(0x000002a6u, ImmutableString("bitfieldExtract(20E00D00D").mangledNameHash());
     ASSERT_EQ(0x0000015du, ImmutableString("bitfieldExtract(30E00D00D").mangledNameHash());
     ASSERT_EQ(0x0000001au, ImmutableString("bitfieldInsert(00D00D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000339u, ImmutableString("bitfieldInsert(10D10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000033au, ImmutableString("bitfieldInsert(10D10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000042u, ImmutableString("bitfieldInsert(20D20D00D00D").mangledNameHash());
     ASSERT_EQ(0x000000d4u, ImmutableString("bitfieldInsert(30D30D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000067u, ImmutableString("bitfieldInsert(00E00E00D00D").mangledNameHash());
-    ASSERT_EQ(0x000002edu, ImmutableString("bitfieldInsert(10E10E00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000021du, ImmutableString("bitfieldInsert(20E20E00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000037fu, ImmutableString("bitfieldInsert(30E30E00D00D").mangledNameHash());
+    ASSERT_EQ(0x000002eeu, ImmutableString("bitfieldInsert(10E10E00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000021eu, ImmutableString("bitfieldInsert(20E20E00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000380u, ImmutableString("bitfieldInsert(30E30E00D00D").mangledNameHash());
     ASSERT_EQ(0x00000159u, ImmutableString("bitfieldReverse(00D").mangledNameHash());
-    ASSERT_EQ(0x00000275u, ImmutableString("bitfieldReverse(10D").mangledNameHash());
+    ASSERT_EQ(0x00000276u, ImmutableString("bitfieldReverse(10D").mangledNameHash());
     ASSERT_EQ(0x0000004fu, ImmutableString("bitfieldReverse(20D").mangledNameHash());
     ASSERT_EQ(0x0000016du, ImmutableString("bitfieldReverse(30D").mangledNameHash());
     ASSERT_EQ(0x0000015au, ImmutableString("bitfieldReverse(00E").mangledNameHash());
-    ASSERT_EQ(0x00000274u, ImmutableString("bitfieldReverse(10E").mangledNameHash());
+    ASSERT_EQ(0x00000275u, ImmutableString("bitfieldReverse(10E").mangledNameHash());
     ASSERT_EQ(0x00000050u, ImmutableString("bitfieldReverse(20E").mangledNameHash());
     ASSERT_EQ(0x0000016cu, ImmutableString("bitfieldReverse(30E").mangledNameHash());
     ASSERT_EQ(0x00000023u, ImmutableString("bitCount(00D").mangledNameHash());
-    ASSERT_EQ(0x00000299u, ImmutableString("bitCount(10D").mangledNameHash());
+    ASSERT_EQ(0x0000029au, ImmutableString("bitCount(10D").mangledNameHash());
     ASSERT_EQ(0x00000196u, ImmutableString("bitCount(20D").mangledNameHash());
     ASSERT_EQ(0x0000007au, ImmutableString("bitCount(30D").mangledNameHash());
     ASSERT_EQ(0x000000f3u, ImmutableString("bitCount(00E").mangledNameHash());
     ASSERT_EQ(0x0000014eu, ImmutableString("bitCount(10E").mangledNameHash());
-    ASSERT_EQ(0x000002b6u, ImmutableString("bitCount(20E").mangledNameHash());
+    ASSERT_EQ(0x000002b7u, ImmutableString("bitCount(20E").mangledNameHash());
     ASSERT_EQ(0x00000133u, ImmutableString("bitCount(30E").mangledNameHash());
-    ASSERT_EQ(0x000002d7u, ImmutableString("findLSB(00D").mangledNameHash());
+    ASSERT_EQ(0x000002d8u, ImmutableString("findLSB(00D").mangledNameHash());
     ASSERT_EQ(0x000001acu, ImmutableString("findLSB(10D").mangledNameHash());
     ASSERT_EQ(0x0000008fu, ImmutableString("findLSB(20D").mangledNameHash());
-    ASSERT_EQ(0x000002b4u, ImmutableString("findLSB(30D").mangledNameHash());
-    ASSERT_EQ(0x000002d6u, ImmutableString("findLSB(00E").mangledNameHash());
+    ASSERT_EQ(0x000002b5u, ImmutableString("findLSB(30D").mangledNameHash());
+    ASSERT_EQ(0x000002d7u, ImmutableString("findLSB(00E").mangledNameHash());
     ASSERT_EQ(0x000001adu, ImmutableString("findLSB(10E").mangledNameHash());
     ASSERT_EQ(0x0000008eu, ImmutableString("findLSB(20E").mangledNameHash());
-    ASSERT_EQ(0x000002b5u, ImmutableString("findLSB(30E").mangledNameHash());
-    ASSERT_EQ(0x000002a1u, ImmutableString("findMSB(00D").mangledNameHash());
+    ASSERT_EQ(0x000002b6u, ImmutableString("findLSB(30E").mangledNameHash());
+    ASSERT_EQ(0x000002a2u, ImmutableString("findMSB(00D").mangledNameHash());
     ASSERT_EQ(0x000000efu, ImmutableString("findMSB(10D").mangledNameHash());
     ASSERT_EQ(0x0000012bu, ImmutableString("findMSB(20D").mangledNameHash());
-    ASSERT_EQ(0x00000246u, ImmutableString("findMSB(30D").mangledNameHash());
-    ASSERT_EQ(0x000002a4u, ImmutableString("findMSB(00E").mangledNameHash());
+    ASSERT_EQ(0x00000247u, ImmutableString("findMSB(30D").mangledNameHash());
+    ASSERT_EQ(0x000002a5u, ImmutableString("findMSB(00E").mangledNameHash());
     ASSERT_EQ(0x000000eeu, ImmutableString("findMSB(10E").mangledNameHash());
     ASSERT_EQ(0x0000012cu, ImmutableString("findMSB(20E").mangledNameHash());
-    ASSERT_EQ(0x00000245u, ImmutableString("findMSB(30E").mangledNameHash());
-    ASSERT_EQ(0x00000223u, ImmutableString("uaddCarry(00E00E00E").mangledNameHash());
-    ASSERT_EQ(0x0000034cu, ImmutableString("uaddCarry(10E10E10E").mangledNameHash());
-    ASSERT_EQ(0x00000371u, ImmutableString("uaddCarry(20E20E20E").mangledNameHash());
+    ASSERT_EQ(0x00000246u, ImmutableString("findMSB(30E").mangledNameHash());
+    ASSERT_EQ(0x00000224u, ImmutableString("uaddCarry(00E00E00E").mangledNameHash());
+    ASSERT_EQ(0x0000034du, ImmutableString("uaddCarry(10E10E10E").mangledNameHash());
+    ASSERT_EQ(0x00000372u, ImmutableString("uaddCarry(20E20E20E").mangledNameHash());
     ASSERT_EQ(0x0000019eu, ImmutableString("uaddCarry(30E30E30E").mangledNameHash());
     ASSERT_EQ(0x000001c8u, ImmutableString("usubBorrow(00E00E00E").mangledNameHash());
-    ASSERT_EQ(0x0000036cu, ImmutableString("usubBorrow(10E10E10E").mangledNameHash());
+    ASSERT_EQ(0x0000036du, ImmutableString("usubBorrow(10E10E10E").mangledNameHash());
     ASSERT_EQ(0x000000f6u, ImmutableString("usubBorrow(20E20E20E").mangledNameHash());
-    ASSERT_EQ(0x0000026bu, ImmutableString("usubBorrow(30E30E30E").mangledNameHash());
-    ASSERT_EQ(0x0000030eu, ImmutableString("umulExtended(00E00E00E00E").mangledNameHash());
+    ASSERT_EQ(0x0000026cu, ImmutableString("usubBorrow(30E30E30E").mangledNameHash());
+    ASSERT_EQ(0x0000030fu, ImmutableString("umulExtended(00E00E00E00E").mangledNameHash());
     ASSERT_EQ(0x00000185u, ImmutableString("umulExtended(10E10E10E10E").mangledNameHash());
-    ASSERT_EQ(0x000002b1u, ImmutableString("umulExtended(20E20E20E20E").mangledNameHash());
-    ASSERT_EQ(0x0000022du, ImmutableString("umulExtended(30E30E30E30E").mangledNameHash());
+    ASSERT_EQ(0x000002b2u, ImmutableString("umulExtended(20E20E20E20E").mangledNameHash());
+    ASSERT_EQ(0x0000022eu, ImmutableString("umulExtended(30E30E30E30E").mangledNameHash());
     ASSERT_EQ(0x000001c5u, ImmutableString("imulExtended(00D00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000085u, ImmutableString("imulExtended(10D10D10D10D").mangledNameHash());
     ASSERT_EQ(0x000000e5u, ImmutableString("imulExtended(20D20D20D20D").mangledNameHash());
     ASSERT_EQ(0x00000027u, ImmutableString("imulExtended(30D30D30D30D").mangledNameHash());
     ASSERT_EQ(0x00000094u, ImmutableString("texture2D(00I10B").mangledNameHash());
     ASSERT_EQ(0x00000127u, ImmutableString("texture2DProj(00I20B").mangledNameHash());
-    ASSERT_EQ(0x00000238u, ImmutableString("texture2DProj(00I30B").mangledNameHash());
-    ASSERT_EQ(0x0000020cu, ImmutableString("textureCube(00K20B").mangledNameHash());
-    ASSERT_EQ(0x0000033fu, ImmutableString("texture2D(00M10B").mangledNameHash());
-    ASSERT_EQ(0x000002a8u, ImmutableString("texture2DProj(00M20B").mangledNameHash());
-    ASSERT_EQ(0x000002adu, ImmutableString("texture2DProj(00M30B").mangledNameHash());
+    ASSERT_EQ(0x00000239u, ImmutableString("texture2DProj(00I30B").mangledNameHash());
+    ASSERT_EQ(0x0000020du, ImmutableString("textureCube(00K20B").mangledNameHash());
+    ASSERT_EQ(0x00000340u, ImmutableString("texture2D(00M10B").mangledNameHash());
+    ASSERT_EQ(0x000002a9u, ImmutableString("texture2DProj(00M20B").mangledNameHash());
+    ASSERT_EQ(0x000002aeu, ImmutableString("texture2DProj(00M30B").mangledNameHash());
     ASSERT_EQ(0x000000e4u, ImmutableString("texture2DRect(00O10B").mangledNameHash());
-    ASSERT_EQ(0x0000039cu, ImmutableString("texture2DRectProj(00O20B").mangledNameHash());
+    ASSERT_EQ(0x0000039du, ImmutableString("texture2DRectProj(00O20B").mangledNameHash());
     ASSERT_EQ(0x00000107u, ImmutableString("texture2DRectProj(00O30B").mangledNameHash());
     ASSERT_EQ(0x0000009cu, ImmutableString("texture(00O10B").mangledNameHash());
     ASSERT_EQ(0x000000fau, ImmutableString("textureProj(00O20B").mangledNameHash());
-    ASSERT_EQ(0x0000021au, ImmutableString("textureProj(00O30B").mangledNameHash());
+    ASSERT_EQ(0x0000021bu, ImmutableString("textureProj(00O30B").mangledNameHash());
     ASSERT_EQ(0x00000066u, ImmutableString("texture2DGradEXT(00I10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x000002ffu, ImmutableString("texture2DProjGradEXT(00I20B10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000300u, ImmutableString("texture2DProjGradEXT(00I20B10B10B").mangledNameHash());
     ASSERT_EQ(0x0000006cu, ImmutableString("texture2DProjGradEXT(00I30B10B10B").mangledNameHash());
     ASSERT_EQ(0x000001ceu, ImmutableString("textureCubeGradEXT(00K20B20B20B").mangledNameHash());
     ASSERT_EQ(0x000001e4u, ImmutableString("texture2D(00I10B00B").mangledNameHash());
-    ASSERT_EQ(0x000002d5u, ImmutableString("texture2DProj(00I20B00B").mangledNameHash());
+    ASSERT_EQ(0x000002d6u, ImmutableString("texture2DProj(00I20B00B").mangledNameHash());
     ASSERT_EQ(0x000001cdu, ImmutableString("texture2DProj(00I30B00B").mangledNameHash());
-    ASSERT_EQ(0x0000032au, ImmutableString("textureCube(00K20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000027du, ImmutableString("dFdx(00B").mangledNameHash());
+    ASSERT_EQ(0x0000032bu, ImmutableString("textureCube(00K20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000027eu, ImmutableString("dFdx(00B").mangledNameHash());
     ASSERT_EQ(0x0000016au, ImmutableString("dFdx(10B").mangledNameHash());
     ASSERT_EQ(0x00000119u, ImmutableString("dFdx(20B").mangledNameHash());
     ASSERT_EQ(0x00000010u, ImmutableString("dFdx(30B").mangledNameHash());
-    ASSERT_EQ(0x00000389u, ImmutableString("dFdy(00B").mangledNameHash());
+    ASSERT_EQ(0x0000038au, ImmutableString("dFdy(00B").mangledNameHash());
     ASSERT_EQ(0x0000013eu, ImmutableString("dFdy(10B").mangledNameHash());
     ASSERT_EQ(0x00000194u, ImmutableString("dFdy(20B").mangledNameHash());
-    ASSERT_EQ(0x000002cau, ImmutableString("dFdy(30B").mangledNameHash());
+    ASSERT_EQ(0x000002cbu, ImmutableString("dFdy(30B").mangledNameHash());
     ASSERT_EQ(0x0000013cu, ImmutableString("fwidth(00B").mangledNameHash());
     ASSERT_EQ(0x000000d6u, ImmutableString("fwidth(10B").mangledNameHash());
-    ASSERT_EQ(0x00000312u, ImmutableString("fwidth(20B").mangledNameHash());
-    ASSERT_EQ(0x0000024au, ImmutableString("fwidth(30B").mangledNameHash());
-    ASSERT_EQ(0x000002c9u, ImmutableString("texture2DLodEXT(00I10B00B").mangledNameHash());
-    ASSERT_EQ(0x000002e0u, ImmutableString("texture2DProjLodEXT(00I20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000313u, ImmutableString("fwidth(20B").mangledNameHash());
+    ASSERT_EQ(0x0000024bu, ImmutableString("fwidth(30B").mangledNameHash());
+    ASSERT_EQ(0x000002cau, ImmutableString("texture2DLodEXT(00I10B00B").mangledNameHash());
+    ASSERT_EQ(0x000002e1u, ImmutableString("texture2DProjLodEXT(00I20B00B").mangledNameHash());
     ASSERT_EQ(0x00000192u, ImmutableString("texture2DProjLodEXT(00I30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000349u, ImmutableString("textureCubeLodEXT(00K20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000034au, ImmutableString("textureCubeLodEXT(00K20B00B").mangledNameHash());
     ASSERT_EQ(0x000001b1u, ImmutableString("texture3D(00J20B").mangledNameHash());
-    ASSERT_EQ(0x00000276u, ImmutableString("texture3DProj(00J30B").mangledNameHash());
-    ASSERT_EQ(0x00000233u, ImmutableString("texture3D(00J20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000025bu, ImmutableString("texture3DProj(00J30B00B").mangledNameHash());
-    ASSERT_EQ(0x000003a6u, ImmutableString("texture3DLod(00J20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000277u, ImmutableString("texture3DProj(00J30B").mangledNameHash());
+    ASSERT_EQ(0x00000234u, ImmutableString("texture3D(00J20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000025cu, ImmutableString("texture3DProj(00J30B00B").mangledNameHash());
+    ASSERT_EQ(0x000003a7u, ImmutableString("texture3DLod(00J20B00B").mangledNameHash());
     ASSERT_EQ(0x00000128u, ImmutableString("texture3DProjLod(00J30B00B").mangledNameHash());
-    ASSERT_EQ(0x0000028cu, ImmutableString("texture2DLod(00I10B00B").mangledNameHash());
+    ASSERT_EQ(0x0000028du, ImmutableString("texture2DLod(00I10B00B").mangledNameHash());
     ASSERT_EQ(0x00000105u, ImmutableString("texture2DProjLod(00I20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000036fu, ImmutableString("texture2DProjLod(00I30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000391u, ImmutableString("textureCubeLod(00K20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000370u, ImmutableString("texture2DProjLod(00I30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000392u, ImmutableString("textureCubeLod(00K20B00B").mangledNameHash());
     ASSERT_EQ(0x000001cfu, ImmutableString("texture(00I10B").mangledNameHash());
-    ASSERT_EQ(0x00000269u, ImmutableString("texture(00R10B").mangledNameHash());
-    ASSERT_EQ(0x000002f9u, ImmutableString("texture(00X10B").mangledNameHash());
+    ASSERT_EQ(0x0000026au, ImmutableString("texture(00R10B").mangledNameHash());
+    ASSERT_EQ(0x000002fau, ImmutableString("texture(00X10B").mangledNameHash());
     ASSERT_EQ(0x00000117u, ImmutableString("texture(00J20B").mangledNameHash());
     ASSERT_EQ(0x00000183u, ImmutableString("texture(00S20B").mangledNameHash());
     ASSERT_EQ(0x00000090u, ImmutableString("texture(00Y20B").mangledNameHash());
-    ASSERT_EQ(0x0000031fu, ImmutableString("texture(00K20B").mangledNameHash());
+    ASSERT_EQ(0x00000320u, ImmutableString("texture(00K20B").mangledNameHash());
     ASSERT_EQ(0x00000089u, ImmutableString("texture(00T20B").mangledNameHash());
     ASSERT_EQ(0x00000044u, ImmutableString("texture(00Z20B").mangledNameHash());
     ASSERT_EQ(0x00000120u, ImmutableString("texture(00L20B").mangledNameHash());
     ASSERT_EQ(0x000000ddu, ImmutableString("texture(00U20B").mangledNameHash());
-    ASSERT_EQ(0x00000235u, ImmutableString("texture(00a20B").mangledNameHash());
+    ASSERT_EQ(0x00000236u, ImmutableString("texture(00a20B").mangledNameHash());
     ASSERT_EQ(0x0000002fu, ImmutableString("texture(00d20B").mangledNameHash());
-    ASSERT_EQ(0x00000358u, ImmutableString("texture(00e30B").mangledNameHash());
-    ASSERT_EQ(0x00000331u, ImmutableString("texture(00f30B").mangledNameHash());
+    ASSERT_EQ(0x00000359u, ImmutableString("texture(00e30B").mangledNameHash());
+    ASSERT_EQ(0x00000332u, ImmutableString("texture(00f30B").mangledNameHash());
     ASSERT_EQ(0x00000059u, ImmutableString("textureProj(00I20B").mangledNameHash());
-    ASSERT_EQ(0x00000384u, ImmutableString("textureProj(00R20B").mangledNameHash());
+    ASSERT_EQ(0x00000385u, ImmutableString("textureProj(00R20B").mangledNameHash());
     ASSERT_EQ(0x0000011au, ImmutableString("textureProj(00X20B").mangledNameHash());
-    ASSERT_EQ(0x00000213u, ImmutableString("textureProj(00I30B").mangledNameHash());
-    ASSERT_EQ(0x00000366u, ImmutableString("textureProj(00R30B").mangledNameHash());
-    ASSERT_EQ(0x0000037cu, ImmutableString("textureProj(00X30B").mangledNameHash());
+    ASSERT_EQ(0x00000214u, ImmutableString("textureProj(00I30B").mangledNameHash());
+    ASSERT_EQ(0x00000367u, ImmutableString("textureProj(00R30B").mangledNameHash());
+    ASSERT_EQ(0x0000037du, ImmutableString("textureProj(00X30B").mangledNameHash());
     ASSERT_EQ(0x00000141u, ImmutableString("textureProj(00J30B").mangledNameHash());
-    ASSERT_EQ(0x000002c7u, ImmutableString("textureProj(00S30B").mangledNameHash());
+    ASSERT_EQ(0x000002c8u, ImmutableString("textureProj(00S30B").mangledNameHash());
     ASSERT_EQ(0x00000195u, ImmutableString("textureProj(00Y30B").mangledNameHash());
-    ASSERT_EQ(0x000002fau, ImmutableString("textureProj(00d30B").mangledNameHash());
+    ASSERT_EQ(0x000002fbu, ImmutableString("textureProj(00d30B").mangledNameHash());
     ASSERT_EQ(0x0000015eu, ImmutableString("textureLod(00I10B00B").mangledNameHash());
-    ASSERT_EQ(0x00000281u, ImmutableString("textureLod(00R10B00B").mangledNameHash());
-    ASSERT_EQ(0x00000294u, ImmutableString("textureLod(00X10B00B").mangledNameHash());
+    ASSERT_EQ(0x00000282u, ImmutableString("textureLod(00R10B00B").mangledNameHash());
+    ASSERT_EQ(0x00000295u, ImmutableString("textureLod(00X10B00B").mangledNameHash());
     ASSERT_EQ(0x000000b7u, ImmutableString("textureLod(00J20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000304u, ImmutableString("textureLod(00S20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000305u, ImmutableString("textureLod(00S20B00B").mangledNameHash());
     ASSERT_EQ(0x00000035u, ImmutableString("textureLod(00Y20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000397u, ImmutableString("textureLod(00K20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000398u, ImmutableString("textureLod(00K20B00B").mangledNameHash());
     ASSERT_EQ(0x000000f5u, ImmutableString("textureLod(00T20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000029du, ImmutableString("textureLod(00Z20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000029eu, ImmutableString("textureLod(00Z20B00B").mangledNameHash());
     ASSERT_EQ(0x00000009u, ImmutableString("textureLod(00L20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000036bu, ImmutableString("textureLod(00U20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000253u, ImmutableString("textureLod(00a20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000036cu, ImmutableString("textureLod(00U20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000254u, ImmutableString("textureLod(00a20B00B").mangledNameHash());
     ASSERT_EQ(0x00000145u, ImmutableString("textureLod(00d20B00B").mangledNameHash());
     ASSERT_EQ(0x000000bdu, ImmutableString("textureSize(00I00D").mangledNameHash());
     ASSERT_EQ(0x000000a5u, ImmutableString("textureSize(00R00D").mangledNameHash());
-    ASSERT_EQ(0x00000376u, ImmutableString("textureSize(00X00D").mangledNameHash());
+    ASSERT_EQ(0x00000377u, ImmutableString("textureSize(00X00D").mangledNameHash());
     ASSERT_EQ(0x000001b8u, ImmutableString("textureSize(00J00D").mangledNameHash());
-    ASSERT_EQ(0x00000326u, ImmutableString("textureSize(00S00D").mangledNameHash());
+    ASSERT_EQ(0x00000327u, ImmutableString("textureSize(00S00D").mangledNameHash());
     ASSERT_EQ(0x0000002du, ImmutableString("textureSize(00Y00D").mangledNameHash());
     ASSERT_EQ(0x00000028u, ImmutableString("textureSize(00K00D").mangledNameHash());
-    ASSERT_EQ(0x00000359u, ImmutableString("textureSize(00T00D").mangledNameHash());
-    ASSERT_EQ(0x000002c0u, ImmutableString("textureSize(00Z00D").mangledNameHash());
-    ASSERT_EQ(0x000002bcu, ImmutableString("textureSize(00L00D").mangledNameHash());
-    ASSERT_EQ(0x000002dbu, ImmutableString("textureSize(00U00D").mangledNameHash());
+    ASSERT_EQ(0x0000035au, ImmutableString("textureSize(00T00D").mangledNameHash());
+    ASSERT_EQ(0x000002c1u, ImmutableString("textureSize(00Z00D").mangledNameHash());
+    ASSERT_EQ(0x000002bdu, ImmutableString("textureSize(00L00D").mangledNameHash());
+    ASSERT_EQ(0x000002dcu, ImmutableString("textureSize(00U00D").mangledNameHash());
     ASSERT_EQ(0x000000deu, ImmutableString("textureSize(00a00D").mangledNameHash());
-    ASSERT_EQ(0x00000346u, ImmutableString("textureSize(00d00D").mangledNameHash());
+    ASSERT_EQ(0x00000347u, ImmutableString("textureSize(00d00D").mangledNameHash());
     ASSERT_EQ(0x000001bdu, ImmutableString("textureSize(00e00D").mangledNameHash());
-    ASSERT_EQ(0x000002f3u, ImmutableString("textureSize(00f00D").mangledNameHash());
+    ASSERT_EQ(0x000002f4u, ImmutableString("textureSize(00f00D").mangledNameHash());
     ASSERT_EQ(0x0000007bu, ImmutableString("textureProjLod(00I20B00B").mangledNameHash());
     ASSERT_EQ(0x000000d7u, ImmutableString("textureProjLod(00R20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000022au, ImmutableString("textureProjLod(00X20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000022bu, ImmutableString("textureProjLod(00X20B00B").mangledNameHash());
     ASSERT_EQ(0x000001aau, ImmutableString("textureProjLod(00I30B00B").mangledNameHash());
     ASSERT_EQ(0x000001dbu, ImmutableString("textureProjLod(00R30B00B").mangledNameHash());
     ASSERT_EQ(0x0000002cu, ImmutableString("textureProjLod(00X30B00B").mangledNameHash());
     ASSERT_EQ(0x000000e3u, ImmutableString("textureProjLod(00J30B00B").mangledNameHash());
     ASSERT_EQ(0x000000b9u, ImmutableString("textureProjLod(00S30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000305u, ImmutableString("textureProjLod(00Y30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000228u, ImmutableString("textureProjLod(00d30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000306u, ImmutableString("textureProjLod(00Y30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000229u, ImmutableString("textureProjLod(00d30B00B").mangledNameHash());
     ASSERT_EQ(0x0000005au, ImmutableString("texelFetch(00I10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000334u, ImmutableString("texelFetch(00R10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000289u, ImmutableString("texelFetch(00X10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000393u, ImmutableString("texelFetch(00J20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000024du, ImmutableString("texelFetch(00S20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000335u, ImmutableString("texelFetch(00R10D00D").mangledNameHash());
+    ASSERT_EQ(0x0000028au, ImmutableString("texelFetch(00X10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000394u, ImmutableString("texelFetch(00J20D00D").mangledNameHash());
+    ASSERT_EQ(0x0000024eu, ImmutableString("texelFetch(00S20D00D").mangledNameHash());
     ASSERT_EQ(0x0000006bu, ImmutableString("texelFetch(00Y20D00D").mangledNameHash());
     ASSERT_EQ(0x00000198u, ImmutableString("texelFetch(00L20D00D").mangledNameHash());
     ASSERT_EQ(0x00000147u, ImmutableString("texelFetch(00U20D00D").mangledNameHash());
     ASSERT_EQ(0x00000038u, ImmutableString("texelFetch(00a20D00D").mangledNameHash());
     ASSERT_EQ(0x00000021u, ImmutableString("textureGrad(00I10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000033cu, ImmutableString("textureGrad(00R10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000247u, ImmutableString("textureGrad(00X10B10B10B").mangledNameHash());
+    ASSERT_EQ(0x0000033du, ImmutableString("textureGrad(00R10B10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000248u, ImmutableString("textureGrad(00X10B10B10B").mangledNameHash());
     ASSERT_EQ(0x000001b4u, ImmutableString("textureGrad(00J20B20B20B").mangledNameHash());
     ASSERT_EQ(0x00000109u, ImmutableString("textureGrad(00S20B20B20B").mangledNameHash());
     ASSERT_EQ(0x00000112u, ImmutableString("textureGrad(00Y20B20B20B").mangledNameHash());
-    ASSERT_EQ(0x0000024bu, ImmutableString("textureGrad(00K20B20B20B").mangledNameHash());
-    ASSERT_EQ(0x0000035eu, ImmutableString("textureGrad(00T20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000024cu, ImmutableString("textureGrad(00K20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000035fu, ImmutableString("textureGrad(00T20B20B20B").mangledNameHash());
     ASSERT_EQ(0x00000156u, ImmutableString("textureGrad(00Z20B20B20B").mangledNameHash());
     ASSERT_EQ(0x0000006du, ImmutableString("textureGrad(00d20B10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000242u, ImmutableString("textureGrad(00e30B20B20B").mangledNameHash());
-    ASSERT_EQ(0x0000033bu, ImmutableString("textureGrad(00L20B10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000243u, ImmutableString("textureGrad(00e30B20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000033cu, ImmutableString("textureGrad(00L20B10B10B").mangledNameHash());
     ASSERT_EQ(0x0000019du, ImmutableString("textureGrad(00U20B10B10B").mangledNameHash());
     ASSERT_EQ(0x000001a5u, ImmutableString("textureGrad(00a20B10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000237u, ImmutableString("textureGrad(00f30B10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000033du, ImmutableString("textureProjGrad(00I20B10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000330u, ImmutableString("textureProjGrad(00R20B10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000238u, ImmutableString("textureGrad(00f30B10B10B").mangledNameHash());
+    ASSERT_EQ(0x0000033eu, ImmutableString("textureProjGrad(00I20B10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000331u, ImmutableString("textureProjGrad(00R20B10B10B").mangledNameHash());
     ASSERT_EQ(0x000001c2u, ImmutableString("textureProjGrad(00X20B10B10B").mangledNameHash());
     ASSERT_EQ(0x0000000cu, ImmutableString("textureProjGrad(00I30B10B10B").mangledNameHash());
     ASSERT_EQ(0x000000f8u, ImmutableString("textureProjGrad(00R30B10B10B").mangledNameHash());
-    ASSERT_EQ(0x000003a2u, ImmutableString("textureProjGrad(00X30B10B10B").mangledNameHash());
+    ASSERT_EQ(0x000003a3u, ImmutableString("textureProjGrad(00X30B10B10B").mangledNameHash());
     ASSERT_EQ(0x0000013du, ImmutableString("textureProjGrad(00J30B20B20B").mangledNameHash());
     ASSERT_EQ(0x00000051u, ImmutableString("textureProjGrad(00S30B20B20B").mangledNameHash());
     ASSERT_EQ(0x0000001bu, ImmutableString("textureProjGrad(00Y30B20B20B").mangledNameHash());
     ASSERT_EQ(0x000001b5u, ImmutableString("textureProjGrad(00d30B10B10B").mangledNameHash());
     ASSERT_EQ(0x000001dcu, ImmutableString("textureSize(00P").mangledNameHash());
-    ASSERT_EQ(0x000002aeu, ImmutableString("textureSize(00V").mangledNameHash());
-    ASSERT_EQ(0x0000020eu, ImmutableString("textureSize(00b").mangledNameHash());
-    ASSERT_EQ(0x00000225u, ImmutableString("textureSize(00Q").mangledNameHash());
-    ASSERT_EQ(0x00000229u, ImmutableString("textureSize(00W").mangledNameHash());
-    ASSERT_EQ(0x0000020du, ImmutableString("textureSize(00c").mangledNameHash());
+    ASSERT_EQ(0x000002afu, ImmutableString("textureSize(00V").mangledNameHash());
+    ASSERT_EQ(0x0000020fu, ImmutableString("textureSize(00b").mangledNameHash());
+    ASSERT_EQ(0x00000226u, ImmutableString("textureSize(00Q").mangledNameHash());
+    ASSERT_EQ(0x0000022au, ImmutableString("textureSize(00W").mangledNameHash());
+    ASSERT_EQ(0x0000020eu, ImmutableString("textureSize(00c").mangledNameHash());
     ASSERT_EQ(0x00000096u, ImmutableString("texelFetch(00P10D00D").mangledNameHash());
     ASSERT_EQ(0x0000012fu, ImmutableString("texelFetch(00V10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000028du, ImmutableString("texelFetch(00b10D00D").mangledNameHash());
-    ASSERT_EQ(0x000002c5u, ImmutableString("texelFetch(00Q20D00D").mangledNameHash());
+    ASSERT_EQ(0x0000028eu, ImmutableString("texelFetch(00b10D00D").mangledNameHash());
+    ASSERT_EQ(0x000002c6u, ImmutableString("texelFetch(00Q20D00D").mangledNameHash());
     ASSERT_EQ(0x00000106u, ImmutableString("texelFetch(00W20D00D").mangledNameHash());
     ASSERT_EQ(0x000001d2u, ImmutableString("texelFetch(00c20D00D").mangledNameHash());
     ASSERT_EQ(0x000000b1u, ImmutableString("texture(00I10B00B").mangledNameHash());
@@ -647,9 +647,9 @@
     ASSERT_EQ(0x00000186u, ImmutableString("texture(00Z20B00B").mangledNameHash());
     ASSERT_EQ(0x000001f4u, ImmutableString("texture(00L20B00B").mangledNameHash());
     ASSERT_EQ(0x00000182u, ImmutableString("texture(00U20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000038eu, ImmutableString("texture(00a20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000386u, ImmutableString("textureProj(00I20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000285u, ImmutableString("textureProj(00R20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000038fu, ImmutableString("texture(00a20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000387u, ImmutableString("textureProj(00I20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000286u, ImmutableString("textureProj(00R20B00B").mangledNameHash());
     ASSERT_EQ(0x000001e5u, ImmutableString("textureProj(00X20B00B").mangledNameHash());
     ASSERT_EQ(0x000000aau, ImmutableString("textureProj(00I30B00B").mangledNameHash());
     ASSERT_EQ(0x00000000u, ImmutableString("textureProj(00R30B00B").mangledNameHash());
@@ -657,244 +657,244 @@
     ASSERT_EQ(0x00000030u, ImmutableString("textureProj(00J30B00B").mangledNameHash());
     ASSERT_EQ(0x00000111u, ImmutableString("textureProj(00S30B00B").mangledNameHash());
     ASSERT_EQ(0x000001b0u, ImmutableString("textureProj(00Y30B00B").mangledNameHash());
-    ASSERT_EQ(0x000002abu, ImmutableString("texture(00d20B00B").mangledNameHash());
+    ASSERT_EQ(0x000002acu, ImmutableString("texture(00d20B00B").mangledNameHash());
     ASSERT_EQ(0x00000160u, ImmutableString("texture(00e30B00B").mangledNameHash());
-    ASSERT_EQ(0x000002f7u, ImmutableString("textureProj(00d30B00B").mangledNameHash());
-    ASSERT_EQ(0x0000038fu, ImmutableString("texture(00M10B00B").mangledNameHash());
-    ASSERT_EQ(0x00000394u, ImmutableString("textureProj(00M20B00B").mangledNameHash());
+    ASSERT_EQ(0x000002f8u, ImmutableString("textureProj(00d30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000390u, ImmutableString("texture(00M10B00B").mangledNameHash());
+    ASSERT_EQ(0x00000395u, ImmutableString("textureProj(00M20B00B").mangledNameHash());
     ASSERT_EQ(0x000000afu, ImmutableString("textureProj(00M30B00B").mangledNameHash());
     ASSERT_EQ(0x00000001u, ImmutableString("texture(00N10B00B").mangledNameHash());
-    ASSERT_EQ(0x000002f4u, ImmutableString("textureProj(00N20B00B").mangledNameHash());
+    ASSERT_EQ(0x000002f5u, ImmutableString("textureProj(00N20B00B").mangledNameHash());
     ASSERT_EQ(0x000000a4u, ImmutableString("textureProj(00N30B00B").mangledNameHash());
     ASSERT_EQ(0x000000a8u, ImmutableString("textureOffset(00I10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000262u, ImmutableString("textureOffset(00R10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000266u, ImmutableString("textureOffset(00X10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000392u, ImmutableString("textureOffset(00J20B20D").mangledNameHash());
-    ASSERT_EQ(0x00000380u, ImmutableString("textureOffset(00S20B20D").mangledNameHash());
-    ASSERT_EQ(0x0000029fu, ImmutableString("textureOffset(00Y20B20D").mangledNameHash());
+    ASSERT_EQ(0x00000263u, ImmutableString("textureOffset(00R10B10D").mangledNameHash());
+    ASSERT_EQ(0x00000267u, ImmutableString("textureOffset(00X10B10D").mangledNameHash());
+    ASSERT_EQ(0x00000393u, ImmutableString("textureOffset(00J20B20D").mangledNameHash());
+    ASSERT_EQ(0x00000381u, ImmutableString("textureOffset(00S20B20D").mangledNameHash());
+    ASSERT_EQ(0x000002a0u, ImmutableString("textureOffset(00Y20B20D").mangledNameHash());
     ASSERT_EQ(0x0000000fu, ImmutableString("textureOffset(00d20B10D").mangledNameHash());
     ASSERT_EQ(0x000000c8u, ImmutableString("textureOffset(00L20B10D").mangledNameHash());
     ASSERT_EQ(0x0000006fu, ImmutableString("textureOffset(00U20B10D").mangledNameHash());
     ASSERT_EQ(0x000000e9u, ImmutableString("textureOffset(00a20B10D").mangledNameHash());
     ASSERT_EQ(0x000000dau, ImmutableString("textureProjOffset(00I20B10D").mangledNameHash());
     ASSERT_EQ(0x000000a1u, ImmutableString("textureProjOffset(00R20B10D").mangledNameHash());
-    ASSERT_EQ(0x00000381u, ImmutableString("textureProjOffset(00X20B10D").mangledNameHash());
+    ASSERT_EQ(0x00000382u, ImmutableString("textureProjOffset(00X20B10D").mangledNameHash());
     ASSERT_EQ(0x0000016bu, ImmutableString("textureProjOffset(00I30B10D").mangledNameHash());
     ASSERT_EQ(0x0000006eu, ImmutableString("textureProjOffset(00R30B10D").mangledNameHash());
-    ASSERT_EQ(0x000002d8u, ImmutableString("textureProjOffset(00X30B10D").mangledNameHash());
-    ASSERT_EQ(0x00000360u, ImmutableString("textureProjOffset(00J30B20D").mangledNameHash());
+    ASSERT_EQ(0x000002d9u, ImmutableString("textureProjOffset(00X30B10D").mangledNameHash());
+    ASSERT_EQ(0x00000361u, ImmutableString("textureProjOffset(00J30B20D").mangledNameHash());
     ASSERT_EQ(0x000000ceu, ImmutableString("textureProjOffset(00S30B20D").mangledNameHash());
-    ASSERT_EQ(0x00000321u, ImmutableString("textureProjOffset(00Y30B20D").mangledNameHash());
-    ASSERT_EQ(0x00000364u, ImmutableString("textureProjOffset(00d30B10D").mangledNameHash());
+    ASSERT_EQ(0x00000322u, ImmutableString("textureProjOffset(00Y30B20D").mangledNameHash());
+    ASSERT_EQ(0x00000365u, ImmutableString("textureProjOffset(00d30B10D").mangledNameHash());
     ASSERT_EQ(0x0000006au, ImmutableString("textureLodOffset(00I10B00B10D").mangledNameHash());
     ASSERT_EQ(0x00000099u, ImmutableString("textureLodOffset(00R10B00B10D").mangledNameHash());
     ASSERT_EQ(0x000000c6u, ImmutableString("textureLodOffset(00X10B00B10D").mangledNameHash());
-    ASSERT_EQ(0x0000023fu, ImmutableString("textureLodOffset(00J20B00B20D").mangledNameHash());
+    ASSERT_EQ(0x00000240u, ImmutableString("textureLodOffset(00J20B00B20D").mangledNameHash());
     ASSERT_EQ(0x0000005eu, ImmutableString("textureLodOffset(00S20B00B20D").mangledNameHash());
     ASSERT_EQ(0x00000161u, ImmutableString("textureLodOffset(00Y20B00B20D").mangledNameHash());
     ASSERT_EQ(0x000001bfu, ImmutableString("textureLodOffset(00d20B00B10D").mangledNameHash());
-    ASSERT_EQ(0x0000034eu, ImmutableString("textureLodOffset(00L20B00B10D").mangledNameHash());
-    ASSERT_EQ(0x00000284u, ImmutableString("textureLodOffset(00U20B00B10D").mangledNameHash());
+    ASSERT_EQ(0x0000034fu, ImmutableString("textureLodOffset(00L20B00B10D").mangledNameHash());
+    ASSERT_EQ(0x00000285u, ImmutableString("textureLodOffset(00U20B00B10D").mangledNameHash());
     ASSERT_EQ(0x00000036u, ImmutableString("textureLodOffset(00a20B00B10D").mangledNameHash());
-    ASSERT_EQ(0x0000032eu, ImmutableString("textureProjLodOffset(00I20B00B10D").mangledNameHash());
+    ASSERT_EQ(0x0000032fu, ImmutableString("textureProjLodOffset(00I20B00B10D").mangledNameHash());
     ASSERT_EQ(0x00000134u, ImmutableString("textureProjLodOffset(00R20B00B10D").mangledNameHash());
     ASSERT_EQ(0x0000017au, ImmutableString("textureProjLodOffset(00X20B00B10D").mangledNameHash());
-    ASSERT_EQ(0x00000336u, ImmutableString("textureProjLodOffset(00I30B00B10D").mangledNameHash());
+    ASSERT_EQ(0x00000337u, ImmutableString("textureProjLodOffset(00I30B00B10D").mangledNameHash());
     ASSERT_EQ(0x000001deu, ImmutableString("textureProjLodOffset(00R30B00B10D").mangledNameHash());
-    ASSERT_EQ(0x00000354u, ImmutableString("textureProjLodOffset(00X30B00B10D").mangledNameHash());
+    ASSERT_EQ(0x00000355u, ImmutableString("textureProjLodOffset(00X30B00B10D").mangledNameHash());
     ASSERT_EQ(0x000001c9u, ImmutableString("textureProjLodOffset(00J30B00B20D").mangledNameHash());
     ASSERT_EQ(0x0000017du, ImmutableString("textureProjLodOffset(00S30B00B20D").mangledNameHash());
     ASSERT_EQ(0x000001bcu, ImmutableString("textureProjLodOffset(00Y30B00B20D").mangledNameHash());
-    ASSERT_EQ(0x00000333u, ImmutableString("textureProjLodOffset(00d30B00B10D").mangledNameHash());
+    ASSERT_EQ(0x00000334u, ImmutableString("textureProjLodOffset(00d30B00B10D").mangledNameHash());
     ASSERT_EQ(0x0000012du, ImmutableString("texelFetchOffset(00I10D00D10D").mangledNameHash());
     ASSERT_EQ(0x000000c0u, ImmutableString("texelFetchOffset(00R10D00D10D").mangledNameHash());
-    ASSERT_EQ(0x000002a9u, ImmutableString("texelFetchOffset(00X10D00D10D").mangledNameHash());
-    ASSERT_EQ(0x00000205u, ImmutableString("texelFetchOffset(00J20D00D20D").mangledNameHash());
+    ASSERT_EQ(0x000002aau, ImmutableString("texelFetchOffset(00X10D00D10D").mangledNameHash());
+    ASSERT_EQ(0x00000206u, ImmutableString("texelFetchOffset(00J20D00D20D").mangledNameHash());
     ASSERT_EQ(0x0000011eu, ImmutableString("texelFetchOffset(00S20D00D20D").mangledNameHash());
     ASSERT_EQ(0x00000037u, ImmutableString("texelFetchOffset(00Y20D00D20D").mangledNameHash());
-    ASSERT_EQ(0x00000259u, ImmutableString("texelFetchOffset(00L20D00D10D").mangledNameHash());
+    ASSERT_EQ(0x0000025au, ImmutableString("texelFetchOffset(00L20D00D10D").mangledNameHash());
     ASSERT_EQ(0x000001bbu, ImmutableString("texelFetchOffset(00U20D00D10D").mangledNameHash());
     ASSERT_EQ(0x00000125u, ImmutableString("texelFetchOffset(00a20D00D10D").mangledNameHash());
-    ASSERT_EQ(0x0000023au, ImmutableString("textureGradOffset(00I10B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x000002dcu, ImmutableString("textureGradOffset(00R10B10B10B10D").mangledNameHash());
+    ASSERT_EQ(0x0000023bu, ImmutableString("textureGradOffset(00I10B10B10B10D").mangledNameHash());
+    ASSERT_EQ(0x000002ddu, ImmutableString("textureGradOffset(00R10B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x00000083u, ImmutableString("textureGradOffset(00X10B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x00000064u, ImmutableString("textureGradOffset(00J20B20B20B20D").mangledNameHash());
     ASSERT_EQ(0x0000009fu, ImmutableString("textureGradOffset(00S20B20B20B20D").mangledNameHash());
-    ASSERT_EQ(0x0000022fu, ImmutableString("textureGradOffset(00Y20B20B20B20D").mangledNameHash());
+    ASSERT_EQ(0x00000230u, ImmutableString("textureGradOffset(00Y20B20B20B20D").mangledNameHash());
     ASSERT_EQ(0x000001ddu, ImmutableString("textureGradOffset(00d20B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000324u, ImmutableString("textureGradOffset(00L20B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x0000024eu, ImmutableString("textureGradOffset(00U20B10B10B10D").mangledNameHash());
+    ASSERT_EQ(0x00000325u, ImmutableString("textureGradOffset(00L20B10B10B10D").mangledNameHash());
+    ASSERT_EQ(0x0000024fu, ImmutableString("textureGradOffset(00U20B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x00000187u, ImmutableString("textureGradOffset(00a20B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000211u, ImmutableString("textureGradOffset(00f30B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x0000036eu,
+    ASSERT_EQ(0x00000212u, ImmutableString("textureGradOffset(00f30B10B10B10D").mangledNameHash());
+    ASSERT_EQ(0x0000036fu,
               ImmutableString("textureProjGradOffset(00I20B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x00000056u,
               ImmutableString("textureProjGradOffset(00R20B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x00000126u,
               ImmutableString("textureProjGradOffset(00X20B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000264u,
+    ASSERT_EQ(0x00000265u,
               ImmutableString("textureProjGradOffset(00I30B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000396u,
+    ASSERT_EQ(0x00000397u,
               ImmutableString("textureProjGradOffset(00R30B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x000000feu,
               ImmutableString("textureProjGradOffset(00X30B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x000003a0u,
+    ASSERT_EQ(0x000003a1u,
               ImmutableString("textureProjGradOffset(00J30B20B20B20D").mangledNameHash());
     ASSERT_EQ(0x00000115u,
               ImmutableString("textureProjGradOffset(00S30B20B20B20D").mangledNameHash());
-    ASSERT_EQ(0x0000035du,
+    ASSERT_EQ(0x0000035eu,
               ImmutableString("textureProjGradOffset(00Y30B20B20B20D").mangledNameHash());
-    ASSERT_EQ(0x00000255u,
+    ASSERT_EQ(0x00000256u,
               ImmutableString("textureProjGradOffset(00d30B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x000000ffu, ImmutableString("textureOffset(00I10B10D00B").mangledNameHash());
-    ASSERT_EQ(0x00000241u, ImmutableString("textureOffset(00R10B10D00B").mangledNameHash());
-    ASSERT_EQ(0x000002b2u, ImmutableString("textureOffset(00X10B10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000242u, ImmutableString("textureOffset(00R10B10D00B").mangledNameHash());
+    ASSERT_EQ(0x000002b3u, ImmutableString("textureOffset(00X10B10D00B").mangledNameHash());
     ASSERT_EQ(0x000000cau, ImmutableString("textureOffset(00J20B20D00B").mangledNameHash());
-    ASSERT_EQ(0x0000026au, ImmutableString("textureOffset(00S20B20D00B").mangledNameHash());
+    ASSERT_EQ(0x0000026bu, ImmutableString("textureOffset(00S20B20D00B").mangledNameHash());
     ASSERT_EQ(0x0000009eu, ImmutableString("textureOffset(00Y20B20D00B").mangledNameHash());
-    ASSERT_EQ(0x00000268u, ImmutableString("textureOffset(00d20B10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000269u, ImmutableString("textureOffset(00d20B10D00B").mangledNameHash());
     ASSERT_EQ(0x000000c5u, ImmutableString("textureOffset(00L20B10D00B").mangledNameHash());
     ASSERT_EQ(0x000001a6u, ImmutableString("textureOffset(00U20B10D00B").mangledNameHash());
-    ASSERT_EQ(0x00000215u, ImmutableString("textureOffset(00a20B10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000216u, ImmutableString("textureOffset(00a20B10D00B").mangledNameHash());
     ASSERT_EQ(0x00000078u, ImmutableString("textureProjOffset(00I20B10D00B").mangledNameHash());
-    ASSERT_EQ(0x0000026du, ImmutableString("textureProjOffset(00R20B10D00B").mangledNameHash());
+    ASSERT_EQ(0x0000026eu, ImmutableString("textureProjOffset(00R20B10D00B").mangledNameHash());
     ASSERT_EQ(0x000000fbu, ImmutableString("textureProjOffset(00X20B10D00B").mangledNameHash());
-    ASSERT_EQ(0x00000345u, ImmutableString("textureProjOffset(00I30B10D00B").mangledNameHash());
-    ASSERT_EQ(0x00000388u, ImmutableString("textureProjOffset(00R30B10D00B").mangledNameHash());
-    ASSERT_EQ(0x00000398u, ImmutableString("textureProjOffset(00X30B10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000346u, ImmutableString("textureProjOffset(00I30B10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000389u, ImmutableString("textureProjOffset(00R30B10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000399u, ImmutableString("textureProjOffset(00X30B10D00B").mangledNameHash());
     ASSERT_EQ(0x00000048u, ImmutableString("textureProjOffset(00J30B20D00B").mangledNameHash());
     ASSERT_EQ(0x0000002bu, ImmutableString("textureProjOffset(00S30B20D00B").mangledNameHash());
-    ASSERT_EQ(0x000002b9u, ImmutableString("textureProjOffset(00Y30B20D00B").mangledNameHash());
-    ASSERT_EQ(0x00000362u, ImmutableString("textureProjOffset(00d30B10D00B").mangledNameHash());
+    ASSERT_EQ(0x000002bau, ImmutableString("textureProjOffset(00Y30B20D00B").mangledNameHash());
+    ASSERT_EQ(0x00000363u, ImmutableString("textureProjOffset(00d30B10D00B").mangledNameHash());
     ASSERT_EQ(0x00000087u, ImmutableString("texture(00M10B").mangledNameHash());
     ASSERT_EQ(0x000000b0u, ImmutableString("textureProj(00M20B").mangledNameHash());
-    ASSERT_EQ(0x0000030au, ImmutableString("textureProj(00M30B").mangledNameHash());
-    ASSERT_EQ(0x00000316u, ImmutableString("textureSize(00M00D").mangledNameHash());
+    ASSERT_EQ(0x0000030bu, ImmutableString("textureProj(00M30B").mangledNameHash());
+    ASSERT_EQ(0x00000317u, ImmutableString("textureSize(00M00D").mangledNameHash());
     ASSERT_EQ(0x0000009bu, ImmutableString("texelFetch(00M10D00D").mangledNameHash());
     ASSERT_EQ(0x0000011fu, ImmutableString("texture(00N10B").mangledNameHash());
-    ASSERT_EQ(0x0000034bu, ImmutableString("textureProj(00N20B").mangledNameHash());
-    ASSERT_EQ(0x00000256u, ImmutableString("textureProj(00N30B").mangledNameHash());
+    ASSERT_EQ(0x0000034cu, ImmutableString("textureProj(00N20B").mangledNameHash());
+    ASSERT_EQ(0x00000257u, ImmutableString("textureProj(00N30B").mangledNameHash());
     ASSERT_EQ(0x0000007du, ImmutableString("rgb_2_yuv(20B00H").mangledNameHash());
     ASSERT_EQ(0x000001a2u, ImmutableString("yuv_2_rgb(20B00H").mangledNameHash());
-    ASSERT_EQ(0x00000204u, ImmutableString("textureSize(00N00D").mangledNameHash());
+    ASSERT_EQ(0x00000205u, ImmutableString("textureSize(00N00D").mangledNameHash());
     ASSERT_EQ(0x0000003du, ImmutableString("texelFetch(00N10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000023cu, ImmutableString("textureGather(00I10B").mangledNameHash());
-    ASSERT_EQ(0x00000302u, ImmutableString("textureGather(00R10B").mangledNameHash());
-    ASSERT_EQ(0x00000216u, ImmutableString("textureGather(00X10B").mangledNameHash());
+    ASSERT_EQ(0x0000023du, ImmutableString("textureGather(00I10B").mangledNameHash());
+    ASSERT_EQ(0x00000303u, ImmutableString("textureGather(00R10B").mangledNameHash());
+    ASSERT_EQ(0x00000217u, ImmutableString("textureGather(00X10B").mangledNameHash());
     ASSERT_EQ(0x0000012eu, ImmutableString("textureGather(00I10B00D").mangledNameHash());
-    ASSERT_EQ(0x000002beu, ImmutableString("textureGather(00R10B00D").mangledNameHash());
+    ASSERT_EQ(0x000002bfu, ImmutableString("textureGather(00R10B00D").mangledNameHash());
     ASSERT_EQ(0x000001bau, ImmutableString("textureGather(00X10B00D").mangledNameHash());
     ASSERT_EQ(0x0000017fu, ImmutableString("textureGather(00L20B").mangledNameHash());
-    ASSERT_EQ(0x000002c1u, ImmutableString("textureGather(00U20B").mangledNameHash());
-    ASSERT_EQ(0x00000218u, ImmutableString("textureGather(00a20B").mangledNameHash());
+    ASSERT_EQ(0x000002c2u, ImmutableString("textureGather(00U20B").mangledNameHash());
+    ASSERT_EQ(0x00000219u, ImmutableString("textureGather(00a20B").mangledNameHash());
     ASSERT_EQ(0x00000114u, ImmutableString("textureGather(00L20B00D").mangledNameHash());
-    ASSERT_EQ(0x000002f2u, ImmutableString("textureGather(00U20B00D").mangledNameHash());
-    ASSERT_EQ(0x0000039fu, ImmutableString("textureGather(00a20B00D").mangledNameHash());
+    ASSERT_EQ(0x000002f3u, ImmutableString("textureGather(00U20B00D").mangledNameHash());
+    ASSERT_EQ(0x000003a0u, ImmutableString("textureGather(00a20B00D").mangledNameHash());
     ASSERT_EQ(0x000000d3u, ImmutableString("textureGather(00K20B").mangledNameHash());
-    ASSERT_EQ(0x0000039eu, ImmutableString("textureGather(00T20B").mangledNameHash());
-    ASSERT_EQ(0x00000265u, ImmutableString("textureGather(00Z20B").mangledNameHash());
+    ASSERT_EQ(0x0000039fu, ImmutableString("textureGather(00T20B").mangledNameHash());
+    ASSERT_EQ(0x00000266u, ImmutableString("textureGather(00Z20B").mangledNameHash());
     ASSERT_EQ(0x00000014u, ImmutableString("textureGather(00K20B00D").mangledNameHash());
-    ASSERT_EQ(0x0000034au, ImmutableString("textureGather(00T20B00D").mangledNameHash());
-    ASSERT_EQ(0x00000301u, ImmutableString("textureGather(00Z20B00D").mangledNameHash());
+    ASSERT_EQ(0x0000034bu, ImmutableString("textureGather(00T20B00D").mangledNameHash());
+    ASSERT_EQ(0x00000302u, ImmutableString("textureGather(00Z20B00D").mangledNameHash());
     ASSERT_EQ(0x00000172u, ImmutableString("textureGather(00d10B").mangledNameHash());
-    ASSERT_EQ(0x00000379u, ImmutableString("textureGather(00d10B00B").mangledNameHash());
+    ASSERT_EQ(0x0000037au, ImmutableString("textureGather(00d10B00B").mangledNameHash());
     ASSERT_EQ(0x00000137u, ImmutableString("textureGather(00f20B").mangledNameHash());
     ASSERT_EQ(0x000001a3u, ImmutableString("textureGather(00f20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000033eu, ImmutableString("textureGather(00e20B").mangledNameHash());
+    ASSERT_EQ(0x0000033fu, ImmutableString("textureGather(00e20B").mangledNameHash());
     ASSERT_EQ(0x00000150u, ImmutableString("textureGather(00e20B00B").mangledNameHash());
     ASSERT_EQ(0x000000c4u, ImmutableString("textureGatherOffset(00I10B10D").mangledNameHash());
     ASSERT_EQ(0x0000005fu, ImmutableString("textureGatherOffset(00R10B10D").mangledNameHash());
-    ASSERT_EQ(0x000002ecu, ImmutableString("textureGatherOffset(00X10B10D").mangledNameHash());
+    ASSERT_EQ(0x000002edu, ImmutableString("textureGatherOffset(00X10B10D").mangledNameHash());
     ASSERT_EQ(0x000001b9u, ImmutableString("textureGatherOffset(00I10B10D00D").mangledNameHash());
     ASSERT_EQ(0x000001e1u, ImmutableString("textureGatherOffset(00R10B10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000035au, ImmutableString("textureGatherOffset(00X10B10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000252u, ImmutableString("textureGatherOffset(00L20B10D").mangledNameHash());
-    ASSERT_EQ(0x000002bau, ImmutableString("textureGatherOffset(00U20B10D").mangledNameHash());
-    ASSERT_EQ(0x00000236u, ImmutableString("textureGatherOffset(00a20B10D").mangledNameHash());
+    ASSERT_EQ(0x0000035bu, ImmutableString("textureGatherOffset(00X10B10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000253u, ImmutableString("textureGatherOffset(00L20B10D").mangledNameHash());
+    ASSERT_EQ(0x000002bbu, ImmutableString("textureGatherOffset(00U20B10D").mangledNameHash());
+    ASSERT_EQ(0x00000237u, ImmutableString("textureGatherOffset(00a20B10D").mangledNameHash());
     ASSERT_EQ(0x00000022u, ImmutableString("textureGatherOffset(00L20B10D00D").mangledNameHash());
     ASSERT_EQ(0x000000e1u, ImmutableString("textureGatherOffset(00U20B10D00D").mangledNameHash());
     ASSERT_EQ(0x000000c2u, ImmutableString("textureGatherOffset(00a20B10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000021bu, ImmutableString("textureGatherOffset(00d10B00B10D").mangledNameHash());
-    ASSERT_EQ(0x00000291u, ImmutableString("textureGatherOffset(00f20B00B10D").mangledNameHash());
+    ASSERT_EQ(0x0000021cu, ImmutableString("textureGatherOffset(00d10B00B10D").mangledNameHash());
+    ASSERT_EQ(0x00000292u, ImmutableString("textureGatherOffset(00f20B00B10D").mangledNameHash());
     ASSERT_EQ(0x000000cdu, ImmutableString("atomicCounter(00G").mangledNameHash());
-    ASSERT_EQ(0x0000034fu, ImmutableString("atomicCounterIncrement(00G").mangledNameHash());
-    ASSERT_EQ(0x00000329u, ImmutableString("atomicCounterDecrement(00G").mangledNameHash());
-    ASSERT_EQ(0x00000243u, ImmutableString("atomicAdd(00E00E").mangledNameHash());
+    ASSERT_EQ(0x00000350u, ImmutableString("atomicCounterIncrement(00G").mangledNameHash());
+    ASSERT_EQ(0x0000032au, ImmutableString("atomicCounterDecrement(00G").mangledNameHash());
+    ASSERT_EQ(0x00000244u, ImmutableString("atomicAdd(00E00E").mangledNameHash());
     ASSERT_EQ(0x0000003eu, ImmutableString("atomicAdd(00D00D").mangledNameHash());
     ASSERT_EQ(0x0000014cu, ImmutableString("atomicMin(00E00E").mangledNameHash());
-    ASSERT_EQ(0x00000375u, ImmutableString("atomicMin(00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000373u, ImmutableString("atomicMax(00E00E").mangledNameHash());
-    ASSERT_EQ(0x00000200u, ImmutableString("atomicMax(00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000376u, ImmutableString("atomicMin(00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000374u, ImmutableString("atomicMax(00E00E").mangledNameHash());
+    ASSERT_EQ(0x00000201u, ImmutableString("atomicMax(00D00D").mangledNameHash());
     ASSERT_EQ(0x000000bbu, ImmutableString("atomicAnd(00E00E").mangledNameHash());
     ASSERT_EQ(0x00000075u, ImmutableString("atomicAnd(00D00D").mangledNameHash());
     ASSERT_EQ(0x000000adu, ImmutableString("atomicOr(00E00E").mangledNameHash());
-    ASSERT_EQ(0x000003a5u, ImmutableString("atomicOr(00D00D").mangledNameHash());
+    ASSERT_EQ(0x000003a6u, ImmutableString("atomicOr(00D00D").mangledNameHash());
     ASSERT_EQ(0x000000a0u, ImmutableString("atomicXor(00E00E").mangledNameHash());
     ASSERT_EQ(0x00000068u, ImmutableString("atomicXor(00D00D").mangledNameHash());
     ASSERT_EQ(0x000000a9u, ImmutableString("atomicExchange(00E00E").mangledNameHash());
     ASSERT_EQ(0x000001e0u, ImmutableString("atomicExchange(00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000320u, ImmutableString("atomicCompSwap(00E00E00E").mangledNameHash());
+    ASSERT_EQ(0x00000321u, ImmutableString("atomicCompSwap(00E00E00E").mangledNameHash());
     ASSERT_EQ(0x000001f8u, ImmutableString("atomicCompSwap(00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000199u, ImmutableString("imageSize(00y").mangledNameHash());
     ASSERT_EQ(0x0000019bu, ImmutableString("imageSize(00z").mangledNameHash());
-    ASSERT_EQ(0x0000028bu, ImmutableString("imageSize(01A").mangledNameHash());
-    ASSERT_EQ(0x00000221u, ImmutableString("imageSize(01B").mangledNameHash());
-    ASSERT_EQ(0x000002d9u, ImmutableString("imageSize(01C").mangledNameHash());
-    ASSERT_EQ(0x00000297u, ImmutableString("imageSize(01D").mangledNameHash());
-    ASSERT_EQ(0x00000287u, ImmutableString("imageSize(01E").mangledNameHash());
-    ASSERT_EQ(0x0000028eu, ImmutableString("imageSize(01F").mangledNameHash());
-    ASSERT_EQ(0x000002ddu, ImmutableString("imageSize(01G").mangledNameHash());
-    ASSERT_EQ(0x000002d2u, ImmutableString("imageSize(01H").mangledNameHash());
-    ASSERT_EQ(0x000002d3u, ImmutableString("imageSize(01I").mangledNameHash());
-    ASSERT_EQ(0x000002d1u, ImmutableString("imageSize(01J").mangledNameHash());
-    ASSERT_EQ(0x00000260u, ImmutableString("imageLoad(00y10D").mangledNameHash());
+    ASSERT_EQ(0x0000028cu, ImmutableString("imageSize(01A").mangledNameHash());
+    ASSERT_EQ(0x00000222u, ImmutableString("imageSize(01B").mangledNameHash());
+    ASSERT_EQ(0x000002dau, ImmutableString("imageSize(01C").mangledNameHash());
+    ASSERT_EQ(0x00000298u, ImmutableString("imageSize(01D").mangledNameHash());
+    ASSERT_EQ(0x00000288u, ImmutableString("imageSize(01E").mangledNameHash());
+    ASSERT_EQ(0x0000028fu, ImmutableString("imageSize(01F").mangledNameHash());
+    ASSERT_EQ(0x000002deu, ImmutableString("imageSize(01G").mangledNameHash());
+    ASSERT_EQ(0x000002d3u, ImmutableString("imageSize(01H").mangledNameHash());
+    ASSERT_EQ(0x000002d4u, ImmutableString("imageSize(01I").mangledNameHash());
+    ASSERT_EQ(0x000002d2u, ImmutableString("imageSize(01J").mangledNameHash());
+    ASSERT_EQ(0x00000261u, ImmutableString("imageLoad(00y10D").mangledNameHash());
     ASSERT_EQ(0x000001f0u, ImmutableString("imageLoad(00z10D").mangledNameHash());
     ASSERT_EQ(0x00000057u, ImmutableString("imageLoad(01A10D").mangledNameHash());
-    ASSERT_EQ(0x000002f6u, ImmutableString("imageLoad(01B20D").mangledNameHash());
-    ASSERT_EQ(0x000002d0u, ImmutableString("imageLoad(01C20D").mangledNameHash());
-    ASSERT_EQ(0x00000353u, ImmutableString("imageLoad(01D20D").mangledNameHash());
-    ASSERT_EQ(0x000002f0u, ImmutableString("imageLoad(01E20D").mangledNameHash());
+    ASSERT_EQ(0x000002f7u, ImmutableString("imageLoad(01B20D").mangledNameHash());
+    ASSERT_EQ(0x000002d1u, ImmutableString("imageLoad(01C20D").mangledNameHash());
+    ASSERT_EQ(0x00000354u, ImmutableString("imageLoad(01D20D").mangledNameHash());
+    ASSERT_EQ(0x000002f1u, ImmutableString("imageLoad(01E20D").mangledNameHash());
     ASSERT_EQ(0x0000003au, ImmutableString("imageLoad(01F20D").mangledNameHash());
     ASSERT_EQ(0x000001f6u, ImmutableString("imageLoad(01G20D").mangledNameHash());
     ASSERT_EQ(0x000000d2u, ImmutableString("imageLoad(01H20D").mangledNameHash());
     ASSERT_EQ(0x000000cfu, ImmutableString("imageLoad(01I20D").mangledNameHash());
-    ASSERT_EQ(0x00000208u, ImmutableString("imageLoad(01J20D").mangledNameHash());
+    ASSERT_EQ(0x00000209u, ImmutableString("imageLoad(01J20D").mangledNameHash());
     ASSERT_EQ(0x000001e2u, ImmutableString("imageStore(00y10D30B").mangledNameHash());
     ASSERT_EQ(0x000000f7u, ImmutableString("imageStore(00z10D30D").mangledNameHash());
     ASSERT_EQ(0x00000116u, ImmutableString("imageStore(01A10D30E").mangledNameHash());
     ASSERT_EQ(0x00000080u, ImmutableString("imageStore(01B20D30B").mangledNameHash());
-    ASSERT_EQ(0x000002e5u, ImmutableString("imageStore(01C20D30D").mangledNameHash());
-    ASSERT_EQ(0x00000327u, ImmutableString("imageStore(01D20D30E").mangledNameHash());
+    ASSERT_EQ(0x000002e6u, ImmutableString("imageStore(01C20D30D").mangledNameHash());
+    ASSERT_EQ(0x00000328u, ImmutableString("imageStore(01D20D30E").mangledNameHash());
     ASSERT_EQ(0x000001c1u, ImmutableString("imageStore(01E20D30B").mangledNameHash());
-    ASSERT_EQ(0x00000385u, ImmutableString("imageStore(01F20D30D").mangledNameHash());
+    ASSERT_EQ(0x00000386u, ImmutableString("imageStore(01F20D30D").mangledNameHash());
     ASSERT_EQ(0x000000d5u, ImmutableString("imageStore(01G20D30E").mangledNameHash());
-    ASSERT_EQ(0x000002c4u, ImmutableString("imageStore(01H20D30B").mangledNameHash());
+    ASSERT_EQ(0x000002c5u, ImmutableString("imageStore(01H20D30B").mangledNameHash());
     ASSERT_EQ(0x0000005cu, ImmutableString("imageStore(01I20D30D").mangledNameHash());
     ASSERT_EQ(0x0000010bu, ImmutableString("imageStore(01J20D30E").mangledNameHash());
     ASSERT_EQ(0x000001fdu, ImmutableString("memoryBarrier(").mangledNameHash());
     ASSERT_EQ(0x00000065u, ImmutableString("memoryBarrierAtomicCounter(").mangledNameHash());
-    ASSERT_EQ(0x000002bfu, ImmutableString("memoryBarrierBuffer(").mangledNameHash());
-    ASSERT_EQ(0x0000035fu, ImmutableString("memoryBarrierImage(").mangledNameHash());
+    ASSERT_EQ(0x000002c0u, ImmutableString("memoryBarrierBuffer(").mangledNameHash());
+    ASSERT_EQ(0x00000360u, ImmutableString("memoryBarrierImage(").mangledNameHash());
     ASSERT_EQ(0x00000121u, ImmutableString("barrier(").mangledNameHash());
     ASSERT_EQ(0x000001edu, ImmutableString("memoryBarrierShared(").mangledNameHash());
     ASSERT_EQ(0x00000054u, ImmutableString("groupMemoryBarrier(").mangledNameHash());
-    ASSERT_EQ(0x00000361u, ImmutableString("EmitVertex(").mangledNameHash());
+    ASSERT_EQ(0x00000362u, ImmutableString("EmitVertex(").mangledNameHash());
     ASSERT_EQ(0x00000034u, ImmutableString("EndPrimitive(").mangledNameHash());
     ASSERT_EQ(0x00000151u, ImmutableString("gl_DepthRangeParameters").mangledNameHash());
     ASSERT_EQ(0x00000084u, ImmutableString("gl_DepthRange").mangledNameHash());
-    ASSERT_EQ(0x0000030fu, ImmutableString("gl_MaxVertexAttribs").mangledNameHash());
-    ASSERT_EQ(0x00000348u, ImmutableString("gl_MaxVertexUniformVectors").mangledNameHash());
+    ASSERT_EQ(0x00000310u, ImmutableString("gl_MaxVertexAttribs").mangledNameHash());
+    ASSERT_EQ(0x00000349u, ImmutableString("gl_MaxVertexUniformVectors").mangledNameHash());
     ASSERT_EQ(0x00000043u, ImmutableString("gl_MaxVertexTextureImageUnits").mangledNameHash());
     ASSERT_EQ(0x0000014du, ImmutableString("gl_MaxCombinedTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x0000031du, ImmutableString("gl_MaxTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x000002e8u, ImmutableString("gl_MaxFragmentUniformVectors").mangledNameHash());
-    ASSERT_EQ(0x00000344u, ImmutableString("gl_MaxVaryingVectors").mangledNameHash());
+    ASSERT_EQ(0x0000031eu, ImmutableString("gl_MaxTextureImageUnits").mangledNameHash());
+    ASSERT_EQ(0x000002e9u, ImmutableString("gl_MaxFragmentUniformVectors").mangledNameHash());
+    ASSERT_EQ(0x00000345u, ImmutableString("gl_MaxVaryingVectors").mangledNameHash());
     ASSERT_EQ(0x000000e0u, ImmutableString("gl_MaxDrawBuffers").mangledNameHash());
-    ASSERT_EQ(0x00000272u, ImmutableString("gl_MaxDualSourceDrawBuffersEXT").mangledNameHash());
+    ASSERT_EQ(0x00000273u, ImmutableString("gl_MaxDualSourceDrawBuffersEXT").mangledNameHash());
     ASSERT_EQ(0x00000088u, ImmutableString("gl_MaxVertexOutputVectors").mangledNameHash());
-    ASSERT_EQ(0x00000369u, ImmutableString("gl_MaxFragmentInputVectors").mangledNameHash());
+    ASSERT_EQ(0x0000036au, ImmutableString("gl_MaxFragmentInputVectors").mangledNameHash());
     ASSERT_EQ(0x0000002eu, ImmutableString("gl_MinProgramTexelOffset").mangledNameHash());
-    ASSERT_EQ(0x00000257u, ImmutableString("gl_MaxProgramTexelOffset").mangledNameHash());
+    ASSERT_EQ(0x00000258u, ImmutableString("gl_MaxProgramTexelOffset").mangledNameHash());
     ASSERT_EQ(0x0000008cu, ImmutableString("gl_MaxImageUnits").mangledNameHash());
     ASSERT_EQ(0x000001d3u, ImmutableString("gl_MaxVertexImageUniforms").mangledNameHash());
     ASSERT_EQ(0x000000a6u, ImmutableString("gl_MaxFragmentImageUniforms").mangledNameHash());
@@ -904,53 +904,54 @@
               ImmutableString("gl_MaxCombinedShaderOutputResources").mangledNameHash());
     ASSERT_EQ(0x000000e2u, ImmutableString("gl_MaxComputeWorkGroupCount").mangledNameHash());
     ASSERT_EQ(0x00000148u, ImmutableString("gl_MaxComputeWorkGroupSize").mangledNameHash());
-    ASSERT_EQ(0x000002bdu, ImmutableString("gl_MaxComputeUniformComponents").mangledNameHash());
+    ASSERT_EQ(0x000002beu, ImmutableString("gl_MaxComputeUniformComponents").mangledNameHash());
     ASSERT_EQ(0x0000010du, ImmutableString("gl_MaxComputeTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x0000037bu, ImmutableString("gl_MaxComputeAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x0000037cu, ImmutableString("gl_MaxComputeAtomicCounters").mangledNameHash());
     ASSERT_EQ(0x000000beu, ImmutableString("gl_MaxComputeAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x0000037du, ImmutableString("gl_MaxVertexAtomicCounters").mangledNameHash());
-    ASSERT_EQ(0x00000283u, ImmutableString("gl_MaxFragmentAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x0000037eu, ImmutableString("gl_MaxVertexAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x00000284u, ImmutableString("gl_MaxFragmentAtomicCounters").mangledNameHash());
     ASSERT_EQ(0x00000113u, ImmutableString("gl_MaxCombinedAtomicCounters").mangledNameHash());
     ASSERT_EQ(0x00000006u, ImmutableString("gl_MaxAtomicCounterBindings").mangledNameHash());
     ASSERT_EQ(0x0000005du, ImmutableString("gl_MaxVertexAtomicCounterBuffers").mangledNameHash());
     ASSERT_EQ(0x000001d6u, ImmutableString("gl_MaxFragmentAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x0000022bu, ImmutableString("gl_MaxCombinedAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x0000028fu, ImmutableString("gl_MaxAtomicCounterBufferSize").mangledNameHash());
-    ASSERT_EQ(0x00000244u, ImmutableString("gl_MaxGeometryInputComponents").mangledNameHash());
+    ASSERT_EQ(0x0000022cu, ImmutableString("gl_MaxCombinedAtomicCounterBuffers").mangledNameHash());
+    ASSERT_EQ(0x00000290u, ImmutableString("gl_MaxAtomicCounterBufferSize").mangledNameHash());
+    ASSERT_EQ(0x00000245u, ImmutableString("gl_MaxGeometryInputComponents").mangledNameHash());
     ASSERT_EQ(0x0000003fu, ImmutableString("gl_MaxGeometryOutputComponents").mangledNameHash());
-    ASSERT_EQ(0x0000025fu, ImmutableString("gl_MaxGeometryImageUniforms").mangledNameHash());
+    ASSERT_EQ(0x00000260u, ImmutableString("gl_MaxGeometryImageUniforms").mangledNameHash());
     ASSERT_EQ(0x00000040u, ImmutableString("gl_MaxGeometryTextureImageUnits").mangledNameHash());
     ASSERT_EQ(0x00000029u, ImmutableString("gl_MaxGeometryOutputVertices").mangledNameHash());
-    ASSERT_EQ(0x000002a2u,
+    ASSERT_EQ(0x000002a3u,
               ImmutableString("gl_MaxGeometryTotalOutputComponents").mangledNameHash());
     ASSERT_EQ(0x00000122u, ImmutableString("gl_MaxGeometryUniformComponents").mangledNameHash());
     ASSERT_EQ(0x000001e3u, ImmutableString("gl_MaxGeometryAtomicCounters").mangledNameHash());
     ASSERT_EQ(0x000000fdu, ImmutableString("gl_MaxGeometryAtomicCounterBuffers").mangledNameHash());
     ASSERT_EQ(0x000000a2u, ImmutableString("gl_FragCoord").mangledNameHash());
-    ASSERT_EQ(0x000002e2u, ImmutableString("gl_FrontFacing").mangledNameHash());
+    ASSERT_EQ(0x000002e3u, ImmutableString("gl_FrontFacing").mangledNameHash());
     ASSERT_EQ(0x00000118u, ImmutableString("gl_PointCoord").mangledNameHash());
     ASSERT_EQ(0x00000076u, ImmutableString("gl_FragColor").mangledNameHash());
-    ASSERT_EQ(0x000002f5u, ImmutableString("gl_FragData").mangledNameHash());
+    ASSERT_EQ(0x000002f6u, ImmutableString("gl_FragData").mangledNameHash());
     ASSERT_EQ(0x00000176u, ImmutableString("gl_FragDepth").mangledNameHash());
-    ASSERT_EQ(0x000002e3u, ImmutableString("gl_SecondaryFragColorEXT").mangledNameHash());
+    ASSERT_EQ(0x00000200u, ImmutableString("gl_HelperInvocation").mangledNameHash());
+    ASSERT_EQ(0x000002e4u, ImmutableString("gl_SecondaryFragColorEXT").mangledNameHash());
     ASSERT_EQ(0x000001cbu, ImmutableString("gl_SecondaryFragDataEXT").mangledNameHash());
     ASSERT_EQ(0x00000169u, ImmutableString("gl_FragDepthEXT").mangledNameHash());
     ASSERT_EQ(0x0000014au, ImmutableString("gl_LastFragData").mangledNameHash());
     ASSERT_EQ(0x00000163u, ImmutableString("gl_LastFragColor").mangledNameHash());
-    ASSERT_EQ(0x00000300u, ImmutableString("gl_LastFragColorARM").mangledNameHash());
+    ASSERT_EQ(0x00000301u, ImmutableString("gl_LastFragColorARM").mangledNameHash());
     ASSERT_EQ(0x00000003u, ImmutableString("gl_PrimitiveID").mangledNameHash());
     ASSERT_EQ(0x0000000eu, ImmutableString("gl_Layer").mangledNameHash());
-    ASSERT_EQ(0x0000031eu, ImmutableString("gl_Position").mangledNameHash());
-    ASSERT_EQ(0x00000374u, ImmutableString("gl_PointSize").mangledNameHash());
+    ASSERT_EQ(0x0000031fu, ImmutableString("gl_Position").mangledNameHash());
+    ASSERT_EQ(0x00000375u, ImmutableString("gl_PointSize").mangledNameHash());
     ASSERT_EQ(0x000001d1u, ImmutableString("gl_InstanceID").mangledNameHash());
-    ASSERT_EQ(0x00000308u, ImmutableString("gl_VertexID").mangledNameHash());
-    ASSERT_EQ(0x000003a4u, ImmutableString("gl_DrawID").mangledNameHash());
-    ASSERT_EQ(0x00000296u, ImmutableString("gl_BaseVertex").mangledNameHash());
-    ASSERT_EQ(0x00000310u, ImmutableString("gl_BaseInstance").mangledNameHash());
+    ASSERT_EQ(0x00000309u, ImmutableString("gl_VertexID").mangledNameHash());
+    ASSERT_EQ(0x000003a5u, ImmutableString("gl_DrawID").mangledNameHash());
+    ASSERT_EQ(0x00000297u, ImmutableString("gl_BaseVertex").mangledNameHash());
+    ASSERT_EQ(0x00000311u, ImmutableString("gl_BaseInstance").mangledNameHash());
     ASSERT_EQ(0x0000000au, ImmutableString("angle_BaseVertex").mangledNameHash());
-    ASSERT_EQ(0x0000031bu, ImmutableString("angle_BaseInstance").mangledNameHash());
-    ASSERT_EQ(0x000002b7u, ImmutableString("gl_NumWorkGroups").mangledNameHash());
-    ASSERT_EQ(0x00000209u, ImmutableString("gl_WorkGroupSize").mangledNameHash());
+    ASSERT_EQ(0x0000031cu, ImmutableString("angle_BaseInstance").mangledNameHash());
+    ASSERT_EQ(0x000002b8u, ImmutableString("gl_NumWorkGroups").mangledNameHash());
+    ASSERT_EQ(0x0000020au, ImmutableString("gl_WorkGroupSize").mangledNameHash());
     ASSERT_EQ(0x000001d7u, ImmutableString("gl_WorkGroupID").mangledNameHash());
     ASSERT_EQ(0x0000016fu, ImmutableString("gl_LocalInvocationID").mangledNameHash());
     ASSERT_EQ(0x000001ebu, ImmutableString("gl_GlobalInvocationID").mangledNameHash());
@@ -959,7 +960,7 @@
     ASSERT_EQ(0x00000142u, ImmutableString("gl_InvocationID").mangledNameHash());
     ASSERT_EQ(0x000001feu, ImmutableString("gl_PerVertex").mangledNameHash());
     ASSERT_EQ(0x000001c6u, ImmutableString("gl_in").mangledNameHash());
-    ASSERT_EQ(0x00000201u, ImmutableString("gl_ViewID_OVR").mangledNameHash());
+    ASSERT_EQ(0x00000202u, ImmutableString("gl_ViewID_OVR").mangledNameHash());
     ASSERT_EQ(0x0000001cu, ImmutableString("radians").unmangledNameHash());
     ASSERT_EQ(0x0000000fu, ImmutableString("degrees").unmangledNameHash());
     ASSERT_EQ(0x0000007du, ImmutableString("sin").unmangledNameHash());
diff --git a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ImmutableString_test_autogen.cpp b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ImmutableString_test_autogen.cpp
index 0790030..3b7ba24 100644
--- a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ImmutableString_test_autogen.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ImmutableString_test_autogen.cpp
@@ -20,65 +20,65 @@
     ASSERT_EQ(0x000000cau, ImmutableString("radians(10B").mangledNameHash());
     ASSERT_EQ(0x000002c8u, ImmutableString("radians(20B").mangledNameHash());
     ASSERT_EQ(0x00000222u, ImmutableString("radians(30B").mangledNameHash());
-    ASSERT_EQ(0x00000765u, ImmutableString("degrees(00B").mangledNameHash());
-    ASSERT_EQ(0x00000812u, ImmutableString("degrees(10B").mangledNameHash());
+    ASSERT_EQ(0x00000766u, ImmutableString("degrees(00B").mangledNameHash());
+    ASSERT_EQ(0x00000813u, ImmutableString("degrees(10B").mangledNameHash());
     ASSERT_EQ(0x00000039u, ImmutableString("degrees(20B").mangledNameHash());
     ASSERT_EQ(0x000000d9u, ImmutableString("degrees(30B").mangledNameHash());
-    ASSERT_EQ(0x00000623u, ImmutableString("sin(00B").mangledNameHash());
-    ASSERT_EQ(0x00000578u, ImmutableString("sin(10B").mangledNameHash());
-    ASSERT_EQ(0x000007cau, ImmutableString("sin(20B").mangledNameHash());
+    ASSERT_EQ(0x00000624u, ImmutableString("sin(00B").mangledNameHash());
+    ASSERT_EQ(0x00000579u, ImmutableString("sin(10B").mangledNameHash());
+    ASSERT_EQ(0x000007cbu, ImmutableString("sin(20B").mangledNameHash());
     ASSERT_EQ(0x000000a6u, ImmutableString("sin(30B").mangledNameHash());
     ASSERT_EQ(0x00000141u, ImmutableString("cos(00B").mangledNameHash());
     ASSERT_EQ(0x000001eeu, ImmutableString("cos(10B").mangledNameHash());
-    ASSERT_EQ(0x00000850u, ImmutableString("cos(20B").mangledNameHash());
+    ASSERT_EQ(0x00000851u, ImmutableString("cos(20B").mangledNameHash());
     ASSERT_EQ(0x0000009eu, ImmutableString("cos(30B").mangledNameHash());
-    ASSERT_EQ(0x00000783u, ImmutableString("tan(00B").mangledNameHash());
-    ASSERT_EQ(0x00000823u, ImmutableString("tan(10B").mangledNameHash());
+    ASSERT_EQ(0x00000784u, ImmutableString("tan(00B").mangledNameHash());
+    ASSERT_EQ(0x00000824u, ImmutableString("tan(10B").mangledNameHash());
     ASSERT_EQ(0x00000438u, ImmutableString("tan(20B").mangledNameHash());
-    ASSERT_EQ(0x000006ecu, ImmutableString("tan(30B").mangledNameHash());
+    ASSERT_EQ(0x000006edu, ImmutableString("tan(30B").mangledNameHash());
     ASSERT_EQ(0x00000157u, ImmutableString("asin(00B").mangledNameHash());
     ASSERT_EQ(0x0000020bu, ImmutableString("asin(10B").mangledNameHash());
-    ASSERT_EQ(0x00000676u, ImmutableString("asin(20B").mangledNameHash());
-    ASSERT_EQ(0x0000070fu, ImmutableString("asin(30B").mangledNameHash());
+    ASSERT_EQ(0x00000677u, ImmutableString("asin(20B").mangledNameHash());
+    ASSERT_EQ(0x00000710u, ImmutableString("asin(30B").mangledNameHash());
     ASSERT_EQ(0x0000026cu, ImmutableString("acos(00B").mangledNameHash());
     ASSERT_EQ(0x000001b4u, ImmutableString("acos(10B").mangledNameHash());
-    ASSERT_EQ(0x000005beu, ImmutableString("acos(20B").mangledNameHash());
+    ASSERT_EQ(0x000005bfu, ImmutableString("acos(20B").mangledNameHash());
     ASSERT_EQ(0x00000520u, ImmutableString("acos(30B").mangledNameHash());
-    ASSERT_EQ(0x00000776u, ImmutableString("atan(00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000777u, ImmutableString("atan(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000026u, ImmutableString("atan(10B10B").mangledNameHash());
     ASSERT_EQ(0x0000055cu, ImmutableString("atan(20B20B").mangledNameHash());
     ASSERT_EQ(0x00000506u, ImmutableString("atan(30B30B").mangledNameHash());
     ASSERT_EQ(0x0000011bu, ImmutableString("atan(00B").mangledNameHash());
-    ASSERT_EQ(0x000006a6u, ImmutableString("atan(10B").mangledNameHash());
+    ASSERT_EQ(0x000006a7u, ImmutableString("atan(10B").mangledNameHash());
     ASSERT_EQ(0x00000280u, ImmutableString("atan(20B").mangledNameHash());
     ASSERT_EQ(0x000001d3u, ImmutableString("atan(30B").mangledNameHash());
     ASSERT_EQ(0x0000020cu, ImmutableString("sinh(00B").mangledNameHash());
-    ASSERT_EQ(0x00000814u, ImmutableString("sinh(10B").mangledNameHash());
+    ASSERT_EQ(0x00000815u, ImmutableString("sinh(10B").mangledNameHash());
     ASSERT_EQ(0x00000345u, ImmutableString("sinh(20B").mangledNameHash());
     ASSERT_EQ(0x000002b9u, ImmutableString("sinh(30B").mangledNameHash());
-    ASSERT_EQ(0x000005c6u, ImmutableString("cosh(00B").mangledNameHash());
-    ASSERT_EQ(0x00000803u, ImmutableString("cosh(10B").mangledNameHash());
+    ASSERT_EQ(0x000005c7u, ImmutableString("cosh(00B").mangledNameHash());
+    ASSERT_EQ(0x00000804u, ImmutableString("cosh(10B").mangledNameHash());
     ASSERT_EQ(0x0000005fu, ImmutableString("cosh(20B").mangledNameHash());
-    ASSERT_EQ(0x000005aau, ImmutableString("cosh(30B").mangledNameHash());
-    ASSERT_EQ(0x00000693u, ImmutableString("tanh(00B").mangledNameHash());
-    ASSERT_EQ(0x00000727u, ImmutableString("tanh(10B").mangledNameHash());
-    ASSERT_EQ(0x000007c8u, ImmutableString("tanh(20B").mangledNameHash());
+    ASSERT_EQ(0x000005abu, ImmutableString("cosh(30B").mangledNameHash());
+    ASSERT_EQ(0x00000694u, ImmutableString("tanh(00B").mangledNameHash());
+    ASSERT_EQ(0x00000728u, ImmutableString("tanh(10B").mangledNameHash());
+    ASSERT_EQ(0x000007c9u, ImmutableString("tanh(20B").mangledNameHash());
     ASSERT_EQ(0x00000009u, ImmutableString("tanh(30B").mangledNameHash());
-    ASSERT_EQ(0x000007bcu, ImmutableString("asinh(00B").mangledNameHash());
-    ASSERT_EQ(0x00000853u, ImmutableString("asinh(10B").mangledNameHash());
+    ASSERT_EQ(0x000007bdu, ImmutableString("asinh(00B").mangledNameHash());
+    ASSERT_EQ(0x00000854u, ImmutableString("asinh(10B").mangledNameHash());
     ASSERT_EQ(0x000002bcu, ImmutableString("asinh(20B").mangledNameHash());
     ASSERT_EQ(0x0000034cu, ImmutableString("asinh(30B").mangledNameHash());
     ASSERT_EQ(0x000000e2u, ImmutableString("acosh(00B").mangledNameHash());
-    ASSERT_EQ(0x000006c7u, ImmutableString("acosh(10B").mangledNameHash());
+    ASSERT_EQ(0x000006c8u, ImmutableString("acosh(10B").mangledNameHash());
     ASSERT_EQ(0x00000243u, ImmutableString("acosh(20B").mangledNameHash());
     ASSERT_EQ(0x00000198u, ImmutableString("acosh(30B").mangledNameHash());
     ASSERT_EQ(0x00000061u, ImmutableString("atanh(00B").mangledNameHash());
     ASSERT_EQ(0x00000244u, ImmutableString("atanh(10B").mangledNameHash());
-    ASSERT_EQ(0x000005e7u, ImmutableString("atanh(20B").mangledNameHash());
+    ASSERT_EQ(0x000005e8u, ImmutableString("atanh(20B").mangledNameHash());
     ASSERT_EQ(0x00000538u, ImmutableString("atanh(30B").mangledNameHash());
     ASSERT_EQ(0x00000533u, ImmutableString("pow(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000288u, ImmutableString("pow(10B10B").mangledNameHash());
-    ASSERT_EQ(0x000005ffu, ImmutableString("pow(20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000600u, ImmutableString("pow(20B20B").mangledNameHash());
     ASSERT_EQ(0x00000350u, ImmutableString("pow(30B30B").mangledNameHash());
     ASSERT_EQ(0x000003dcu, ImmutableString("exp(00B").mangledNameHash());
     ASSERT_EQ(0x0000047fu, ImmutableString("exp(10B").mangledNameHash());
@@ -88,13 +88,13 @@
     ASSERT_EQ(0x000000e3u, ImmutableString("log(10B").mangledNameHash());
     ASSERT_EQ(0x000002d9u, ImmutableString("log(20B").mangledNameHash());
     ASSERT_EQ(0x000004b6u, ImmutableString("log(30B").mangledNameHash());
-    ASSERT_EQ(0x0000065bu, ImmutableString("exp2(00B").mangledNameHash());
-    ASSERT_EQ(0x000006efu, ImmutableString("exp2(10B").mangledNameHash());
+    ASSERT_EQ(0x0000065cu, ImmutableString("exp2(00B").mangledNameHash());
+    ASSERT_EQ(0x000006f0u, ImmutableString("exp2(10B").mangledNameHash());
     ASSERT_EQ(0x00000510u, ImmutableString("exp2(20B").mangledNameHash());
-    ASSERT_EQ(0x000005a3u, ImmutableString("exp2(30B").mangledNameHash());
-    ASSERT_EQ(0x00000726u, ImmutableString("log2(00B").mangledNameHash());
-    ASSERT_EQ(0x000006b2u, ImmutableString("log2(10B").mangledNameHash());
-    ASSERT_EQ(0x0000060au, ImmutableString("log2(20B").mangledNameHash());
+    ASSERT_EQ(0x000005a4u, ImmutableString("exp2(30B").mangledNameHash());
+    ASSERT_EQ(0x00000727u, ImmutableString("log2(00B").mangledNameHash());
+    ASSERT_EQ(0x000006b3u, ImmutableString("log2(10B").mangledNameHash());
+    ASSERT_EQ(0x0000060bu, ImmutableString("log2(20B").mangledNameHash());
     ASSERT_EQ(0x00000321u, ImmutableString("log2(30B").mangledNameHash());
     ASSERT_EQ(0x00000332u, ImmutableString("sqrt(00B").mangledNameHash());
     ASSERT_EQ(0x0000029fu, ImmutableString("sqrt(10B").mangledNameHash());
@@ -105,74 +105,74 @@
     ASSERT_EQ(0x00000484u, ImmutableString("sqrt(20C").mangledNameHash());
     ASSERT_EQ(0x000003d9u, ImmutableString("sqrt(30C").mangledNameHash());
     ASSERT_EQ(0x00000042u, ImmutableString("inversesqrt(00B").mangledNameHash());
-    ASSERT_EQ(0x000007f2u, ImmutableString("inversesqrt(10B").mangledNameHash());
+    ASSERT_EQ(0x000007f3u, ImmutableString("inversesqrt(10B").mangledNameHash());
     ASSERT_EQ(0x0000015fu, ImmutableString("inversesqrt(20B").mangledNameHash());
     ASSERT_EQ(0x000000dau, ImmutableString("inversesqrt(30B").mangledNameHash());
     ASSERT_EQ(0x00000041u, ImmutableString("inversesqrt(00C").mangledNameHash());
-    ASSERT_EQ(0x000007f3u, ImmutableString("inversesqrt(10C").mangledNameHash());
+    ASSERT_EQ(0x000007f4u, ImmutableString("inversesqrt(10C").mangledNameHash());
     ASSERT_EQ(0x0000015eu, ImmutableString("inversesqrt(20C").mangledNameHash());
     ASSERT_EQ(0x000000dbu, ImmutableString("inversesqrt(30C").mangledNameHash());
     ASSERT_EQ(0x00000382u, ImmutableString("abs(00B").mangledNameHash());
     ASSERT_EQ(0x000002f3u, ImmutableString("abs(10B").mangledNameHash());
     ASSERT_EQ(0x0000025fu, ImmutableString("abs(20B").mangledNameHash());
-    ASSERT_EQ(0x000005f2u, ImmutableString("abs(30B").mangledNameHash());
+    ASSERT_EQ(0x000005f3u, ImmutableString("abs(30B").mangledNameHash());
     ASSERT_EQ(0x00000380u, ImmutableString("abs(00D").mangledNameHash());
     ASSERT_EQ(0x000002f2u, ImmutableString("abs(10D").mangledNameHash());
     ASSERT_EQ(0x0000025du, ImmutableString("abs(20D").mangledNameHash());
-    ASSERT_EQ(0x000007f4u, ImmutableString("abs(30D").mangledNameHash());
+    ASSERT_EQ(0x000007f5u, ImmutableString("abs(30D").mangledNameHash());
     ASSERT_EQ(0x00000381u, ImmutableString("abs(00C").mangledNameHash());
     ASSERT_EQ(0x000002f4u, ImmutableString("abs(10C").mangledNameHash());
     ASSERT_EQ(0x0000025eu, ImmutableString("abs(20C").mangledNameHash());
-    ASSERT_EQ(0x000007f6u, ImmutableString("abs(30C").mangledNameHash());
+    ASSERT_EQ(0x000007f7u, ImmutableString("abs(30C").mangledNameHash());
     ASSERT_EQ(0x000000d1u, ImmutableString("sign(00B").mangledNameHash());
-    ASSERT_EQ(0x00000653u, ImmutableString("sign(10B").mangledNameHash());
+    ASSERT_EQ(0x00000654u, ImmutableString("sign(10B").mangledNameHash());
     ASSERT_EQ(0x000001e0u, ImmutableString("sign(20B").mangledNameHash());
     ASSERT_EQ(0x000000f2u, ImmutableString("sign(30B").mangledNameHash());
-    ASSERT_EQ(0x000005cbu, ImmutableString("sign(00D").mangledNameHash());
-    ASSERT_EQ(0x00000807u, ImmutableString("sign(10D").mangledNameHash());
+    ASSERT_EQ(0x000005ccu, ImmutableString("sign(00D").mangledNameHash());
+    ASSERT_EQ(0x00000808u, ImmutableString("sign(10D").mangledNameHash());
     ASSERT_EQ(0x00000060u, ImmutableString("sign(20D").mangledNameHash());
     ASSERT_EQ(0x000000f4u, ImmutableString("sign(30D").mangledNameHash());
-    ASSERT_EQ(0x000005c5u, ImmutableString("sign(00C").mangledNameHash());
-    ASSERT_EQ(0x00000804u, ImmutableString("sign(10C").mangledNameHash());
+    ASSERT_EQ(0x000005c6u, ImmutableString("sign(00C").mangledNameHash());
+    ASSERT_EQ(0x00000805u, ImmutableString("sign(10C").mangledNameHash());
     ASSERT_EQ(0x0000005eu, ImmutableString("sign(20C").mangledNameHash());
     ASSERT_EQ(0x000000f3u, ImmutableString("sign(30C").mangledNameHash());
     ASSERT_EQ(0x0000043au, ImmutableString("floor(00B").mangledNameHash());
     ASSERT_EQ(0x00000136u, ImmutableString("floor(10B").mangledNameHash());
-    ASSERT_EQ(0x00000588u, ImmutableString("floor(20B").mangledNameHash());
+    ASSERT_EQ(0x00000589u, ImmutableString("floor(20B").mangledNameHash());
     ASSERT_EQ(0x000004f0u, ImmutableString("floor(30B").mangledNameHash());
     ASSERT_EQ(0x00000439u, ImmutableString("floor(00C").mangledNameHash());
     ASSERT_EQ(0x00000137u, ImmutableString("floor(10C").mangledNameHash());
-    ASSERT_EQ(0x00000587u, ImmutableString("floor(20C").mangledNameHash());
+    ASSERT_EQ(0x00000588u, ImmutableString("floor(20C").mangledNameHash());
     ASSERT_EQ(0x000004f1u, ImmutableString("floor(30C").mangledNameHash());
-    ASSERT_EQ(0x000006e4u, ImmutableString("trunc(00B").mangledNameHash());
-    ASSERT_EQ(0x00000647u, ImmutableString("trunc(10B").mangledNameHash());
-    ASSERT_EQ(0x00000820u, ImmutableString("trunc(20B").mangledNameHash());
-    ASSERT_EQ(0x0000077au, ImmutableString("trunc(30B").mangledNameHash());
-    ASSERT_EQ(0x00000795u, ImmutableString("trunc(00C").mangledNameHash());
-    ASSERT_EQ(0x00000648u, ImmutableString("trunc(10C").mangledNameHash());
-    ASSERT_EQ(0x0000081fu, ImmutableString("trunc(20C").mangledNameHash());
-    ASSERT_EQ(0x0000077bu, ImmutableString("trunc(30C").mangledNameHash());
+    ASSERT_EQ(0x000006e5u, ImmutableString("trunc(00B").mangledNameHash());
+    ASSERT_EQ(0x00000648u, ImmutableString("trunc(10B").mangledNameHash());
+    ASSERT_EQ(0x00000821u, ImmutableString("trunc(20B").mangledNameHash());
+    ASSERT_EQ(0x0000077bu, ImmutableString("trunc(30B").mangledNameHash());
+    ASSERT_EQ(0x00000796u, ImmutableString("trunc(00C").mangledNameHash());
+    ASSERT_EQ(0x00000649u, ImmutableString("trunc(10C").mangledNameHash());
+    ASSERT_EQ(0x00000820u, ImmutableString("trunc(20C").mangledNameHash());
+    ASSERT_EQ(0x0000077cu, ImmutableString("trunc(30C").mangledNameHash());
     ASSERT_EQ(0x00000089u, ImmutableString("round(00B").mangledNameHash());
-    ASSERT_EQ(0x0000082eu, ImmutableString("round(10B").mangledNameHash());
+    ASSERT_EQ(0x0000082fu, ImmutableString("round(10B").mangledNameHash());
     ASSERT_EQ(0x0000038eu, ImmutableString("round(20B").mangledNameHash());
-    ASSERT_EQ(0x000006f5u, ImmutableString("round(30B").mangledNameHash());
+    ASSERT_EQ(0x000006f6u, ImmutableString("round(30B").mangledNameHash());
     ASSERT_EQ(0x00000088u, ImmutableString("round(00C").mangledNameHash());
-    ASSERT_EQ(0x0000082fu, ImmutableString("round(10C").mangledNameHash());
+    ASSERT_EQ(0x00000830u, ImmutableString("round(10C").mangledNameHash());
     ASSERT_EQ(0x0000038bu, ImmutableString("round(20C").mangledNameHash());
-    ASSERT_EQ(0x000006f6u, ImmutableString("round(30C").mangledNameHash());
-    ASSERT_EQ(0x000005e5u, ImmutableString("roundEven(00B").mangledNameHash());
+    ASSERT_EQ(0x000006f7u, ImmutableString("round(30C").mangledNameHash());
+    ASSERT_EQ(0x000005e6u, ImmutableString("roundEven(00B").mangledNameHash());
     ASSERT_EQ(0x00000536u, ImmutableString("roundEven(10B").mangledNameHash());
     ASSERT_EQ(0x000002dfu, ImmutableString("roundEven(20B").mangledNameHash());
     ASSERT_EQ(0x00000241u, ImmutableString("roundEven(30B").mangledNameHash());
-    ASSERT_EQ(0x000005e4u, ImmutableString("roundEven(00C").mangledNameHash());
+    ASSERT_EQ(0x000005e5u, ImmutableString("roundEven(00C").mangledNameHash());
     ASSERT_EQ(0x00000537u, ImmutableString("roundEven(10C").mangledNameHash());
     ASSERT_EQ(0x000002deu, ImmutableString("roundEven(20C").mangledNameHash());
     ASSERT_EQ(0x00000242u, ImmutableString("roundEven(30C").mangledNameHash());
-    ASSERT_EQ(0x000007a5u, ImmutableString("ceil(00B").mangledNameHash());
+    ASSERT_EQ(0x000007a6u, ImmutableString("ceil(00B").mangledNameHash());
     ASSERT_EQ(0x000001d6u, ImmutableString("ceil(10B").mangledNameHash());
     ASSERT_EQ(0x00000290u, ImmutableString("ceil(20B").mangledNameHash());
     ASSERT_EQ(0x000001dau, ImmutableString("ceil(30B").mangledNameHash());
-    ASSERT_EQ(0x000007a4u, ImmutableString("ceil(00C").mangledNameHash());
+    ASSERT_EQ(0x000007a5u, ImmutableString("ceil(00C").mangledNameHash());
     ASSERT_EQ(0x0000002eu, ImmutableString("ceil(10C").mangledNameHash());
     ASSERT_EQ(0x0000028fu, ImmutableString("ceil(20C").mangledNameHash());
     ASSERT_EQ(0x0000031eu, ImmutableString("ceil(30C").mangledNameHash());
@@ -185,142 +185,142 @@
     ASSERT_EQ(0x000003c8u, ImmutableString("fract(20C").mangledNameHash());
     ASSERT_EQ(0x00000324u, ImmutableString("fract(30C").mangledNameHash());
     ASSERT_EQ(0x00000534u, ImmutableString("mod(00B00B").mangledNameHash());
-    ASSERT_EQ(0x0000071au, ImmutableString("mod(10B00B").mangledNameHash());
-    ASSERT_EQ(0x000006cbu, ImmutableString("mod(20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000071bu, ImmutableString("mod(10B00B").mangledNameHash());
+    ASSERT_EQ(0x000006ccu, ImmutableString("mod(20B00B").mangledNameHash());
     ASSERT_EQ(0x000000feu, ImmutableString("mod(30B00B").mangledNameHash());
-    ASSERT_EQ(0x000007deu, ImmutableString("mod(10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000057au, ImmutableString("mod(20B20B").mangledNameHash());
-    ASSERT_EQ(0x0000059fu, ImmutableString("mod(30B30B").mangledNameHash());
+    ASSERT_EQ(0x000007dfu, ImmutableString("mod(10B10B").mangledNameHash());
+    ASSERT_EQ(0x0000057bu, ImmutableString("mod(20B20B").mangledNameHash());
+    ASSERT_EQ(0x000005a0u, ImmutableString("mod(30B30B").mangledNameHash());
     ASSERT_EQ(0x0000004fu, ImmutableString("mod(00C00C").mangledNameHash());
-    ASSERT_EQ(0x000005f9u, ImmutableString("mod(10C00C").mangledNameHash());
+    ASSERT_EQ(0x000005fau, ImmutableString("mod(10C00C").mangledNameHash());
     ASSERT_EQ(0x000001bbu, ImmutableString("mod(20C00C").mangledNameHash());
-    ASSERT_EQ(0x0000084au, ImmutableString("mod(30C00C").mangledNameHash());
+    ASSERT_EQ(0x0000084bu, ImmutableString("mod(30C00C").mangledNameHash());
     ASSERT_EQ(0x00000314u, ImmutableString("mod(10C10C").mangledNameHash());
     ASSERT_EQ(0x00000323u, ImmutableString("mod(20C20C").mangledNameHash());
     ASSERT_EQ(0x0000043du, ImmutableString("mod(30C30C").mangledNameHash());
-    ASSERT_EQ(0x00000760u, ImmutableString("min(00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000761u, ImmutableString("min(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000256u, ImmutableString("min(10B00B").mangledNameHash());
     ASSERT_EQ(0x0000029bu, ImmutableString("min(20B00B").mangledNameHash());
     ASSERT_EQ(0x0000047au, ImmutableString("min(30B00B").mangledNameHash());
     ASSERT_EQ(0x00000285u, ImmutableString("min(10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000078bu, ImmutableString("min(20B20B").mangledNameHash());
-    ASSERT_EQ(0x0000069cu, ImmutableString("min(30B30B").mangledNameHash());
+    ASSERT_EQ(0x0000078cu, ImmutableString("min(20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000069du, ImmutableString("min(30B30B").mangledNameHash());
     ASSERT_EQ(0x0000003du, ImmutableString("min(00C00C").mangledNameHash());
-    ASSERT_EQ(0x0000063cu, ImmutableString("min(10C10C").mangledNameHash());
-    ASSERT_EQ(0x00000749u, ImmutableString("min(20C20C").mangledNameHash());
+    ASSERT_EQ(0x0000063du, ImmutableString("min(10C10C").mangledNameHash());
+    ASSERT_EQ(0x0000074au, ImmutableString("min(20C20C").mangledNameHash());
     ASSERT_EQ(0x00000432u, ImmutableString("min(30C30C").mangledNameHash());
-    ASSERT_EQ(0x000006dau, ImmutableString("min(10C00C").mangledNameHash());
+    ASSERT_EQ(0x000006dbu, ImmutableString("min(10C00C").mangledNameHash());
     ASSERT_EQ(0x00000399u, ImmutableString("min(20C00C").mangledNameHash());
     ASSERT_EQ(0x00000111u, ImmutableString("min(30C00C").mangledNameHash());
     ASSERT_EQ(0x000001e3u, ImmutableString("min(00D00D").mangledNameHash());
     ASSERT_EQ(0x00000463u, ImmutableString("min(10D10D").mangledNameHash());
-    ASSERT_EQ(0x000007c2u, ImmutableString("min(20D20D").mangledNameHash());
-    ASSERT_EQ(0x000007afu, ImmutableString("min(30D30D").mangledNameHash());
+    ASSERT_EQ(0x000007c3u, ImmutableString("min(20D20D").mangledNameHash());
+    ASSERT_EQ(0x000007b0u, ImmutableString("min(30D30D").mangledNameHash());
     ASSERT_EQ(0x000003a5u, ImmutableString("min(10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000689u, ImmutableString("min(20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000845u, ImmutableString("min(30D00D").mangledNameHash());
+    ASSERT_EQ(0x0000068au, ImmutableString("min(20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000846u, ImmutableString("min(30D00D").mangledNameHash());
     ASSERT_EQ(0x00000360u, ImmutableString("min(00E00E").mangledNameHash());
-    ASSERT_EQ(0x0000082cu, ImmutableString("min(10E10E").mangledNameHash());
-    ASSERT_EQ(0x00000675u, ImmutableString("min(20E20E").mangledNameHash());
-    ASSERT_EQ(0x0000075bu, ImmutableString("min(30E30E").mangledNameHash());
+    ASSERT_EQ(0x0000082du, ImmutableString("min(10E10E").mangledNameHash());
+    ASSERT_EQ(0x00000676u, ImmutableString("min(20E20E").mangledNameHash());
+    ASSERT_EQ(0x0000075cu, ImmutableString("min(30E30E").mangledNameHash());
     ASSERT_EQ(0x00000084u, ImmutableString("min(10E00E").mangledNameHash());
-    ASSERT_EQ(0x00000784u, ImmutableString("min(20E00E").mangledNameHash());
+    ASSERT_EQ(0x00000785u, ImmutableString("min(20E00E").mangledNameHash());
     ASSERT_EQ(0x00000527u, ImmutableString("min(30E00E").mangledNameHash());
     ASSERT_EQ(0x0000050bu, ImmutableString("max(00B00B").mangledNameHash());
-    ASSERT_EQ(0x000007b6u, ImmutableString("max(10B00B").mangledNameHash());
+    ASSERT_EQ(0x000007b7u, ImmutableString("max(10B00B").mangledNameHash());
     ASSERT_EQ(0x0000024cu, ImmutableString("max(20B00B").mangledNameHash());
     ASSERT_EQ(0x00000375u, ImmutableString("max(30B00B").mangledNameHash());
     ASSERT_EQ(0x00000208u, ImmutableString("max(10B10B").mangledNameHash());
-    ASSERT_EQ(0x000005c1u, ImmutableString("max(20B20B").mangledNameHash());
+    ASSERT_EQ(0x000005c2u, ImmutableString("max(20B20B").mangledNameHash());
     ASSERT_EQ(0x000000afu, ImmutableString("max(30B30B").mangledNameHash());
-    ASSERT_EQ(0x00000822u, ImmutableString("max(00C00C").mangledNameHash());
-    ASSERT_EQ(0x000005f0u, ImmutableString("max(10C10C").mangledNameHash());
+    ASSERT_EQ(0x00000823u, ImmutableString("max(00C00C").mangledNameHash());
+    ASSERT_EQ(0x000005f1u, ImmutableString("max(10C10C").mangledNameHash());
     ASSERT_EQ(0x00000207u, ImmutableString("max(20C20C").mangledNameHash());
     ASSERT_EQ(0x00000393u, ImmutableString("max(30C30C").mangledNameHash());
-    ASSERT_EQ(0x00000695u, ImmutableString("max(10C00C").mangledNameHash());
-    ASSERT_EQ(0x000005a5u, ImmutableString("max(20C00C").mangledNameHash());
+    ASSERT_EQ(0x00000696u, ImmutableString("max(10C00C").mangledNameHash());
+    ASSERT_EQ(0x000005a6u, ImmutableString("max(20C00C").mangledNameHash());
     ASSERT_EQ(0x000002fdu, ImmutableString("max(30C00C").mangledNameHash());
     ASSERT_EQ(0x000002e9u, ImmutableString("max(00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000583u, ImmutableString("max(10D10D").mangledNameHash());
-    ASSERT_EQ(0x00000582u, ImmutableString("max(20D20D").mangledNameHash());
+    ASSERT_EQ(0x00000584u, ImmutableString("max(10D10D").mangledNameHash());
+    ASSERT_EQ(0x00000583u, ImmutableString("max(20D20D").mangledNameHash());
     ASSERT_EQ(0x000003ddu, ImmutableString("max(30D30D").mangledNameHash());
     ASSERT_EQ(0x000004edu, ImmutableString("max(10D00D").mangledNameHash());
-    ASSERT_EQ(0x000006d3u, ImmutableString("max(20D00D").mangledNameHash());
+    ASSERT_EQ(0x000006d4u, ImmutableString("max(20D00D").mangledNameHash());
     ASSERT_EQ(0x00000047u, ImmutableString("max(30D00D").mangledNameHash());
-    ASSERT_EQ(0x00000654u, ImmutableString("max(00E00E").mangledNameHash());
+    ASSERT_EQ(0x00000655u, ImmutableString("max(00E00E").mangledNameHash());
     ASSERT_EQ(0x000000aeu, ImmutableString("max(10E10E").mangledNameHash());
     ASSERT_EQ(0x000002f0u, ImmutableString("max(20E20E").mangledNameHash());
     ASSERT_EQ(0x00000327u, ImmutableString("max(30E30E").mangledNameHash());
     ASSERT_EQ(0x00000340u, ImmutableString("max(10E00E").mangledNameHash());
     ASSERT_EQ(0x000001a6u, ImmutableString("max(20E00E").mangledNameHash());
-    ASSERT_EQ(0x00000716u, ImmutableString("max(30E00E").mangledNameHash());
-    ASSERT_EQ(0x0000072du, ImmutableString("clamp(00B00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000717u, ImmutableString("max(30E00E").mangledNameHash());
+    ASSERT_EQ(0x0000072eu, ImmutableString("clamp(00B00B00B").mangledNameHash());
     ASSERT_EQ(0x000004fau, ImmutableString("clamp(10B00B00B").mangledNameHash());
-    ASSERT_EQ(0x000005b9u, ImmutableString("clamp(20B00B00B").mangledNameHash());
+    ASSERT_EQ(0x000005bau, ImmutableString("clamp(20B00B00B").mangledNameHash());
     ASSERT_EQ(0x000004eau, ImmutableString("clamp(30B00B00B").mangledNameHash());
     ASSERT_EQ(0x00000246u, ImmutableString("clamp(10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000081cu, ImmutableString("clamp(20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000081du, ImmutableString("clamp(20B20B20B").mangledNameHash());
     ASSERT_EQ(0x00000027u, ImmutableString("clamp(30B30B30B").mangledNameHash());
     ASSERT_EQ(0x0000033eu, ImmutableString("clamp(00C00C00C").mangledNameHash());
     ASSERT_EQ(0x0000049du, ImmutableString("clamp(10C00C00C").mangledNameHash());
     ASSERT_EQ(0x00000277u, ImmutableString("clamp(20C00C00C").mangledNameHash());
     ASSERT_EQ(0x00000344u, ImmutableString("clamp(30C00C00C").mangledNameHash());
-    ASSERT_EQ(0x00000732u, ImmutableString("clamp(10C10C10C").mangledNameHash());
+    ASSERT_EQ(0x00000733u, ImmutableString("clamp(10C10C10C").mangledNameHash());
     ASSERT_EQ(0x0000007au, ImmutableString("clamp(20C20C20C").mangledNameHash());
-    ASSERT_EQ(0x000006aau, ImmutableString("clamp(30C30C30C").mangledNameHash());
+    ASSERT_EQ(0x000006abu, ImmutableString("clamp(30C30C30C").mangledNameHash());
     ASSERT_EQ(0x000004efu, ImmutableString("clamp(00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000231u, ImmutableString("clamp(10D00D00D").mangledNameHash());
     ASSERT_EQ(0x000000fcu, ImmutableString("clamp(20D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000042au, ImmutableString("clamp(30D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000006bdu, ImmutableString("clamp(10D10D10D").mangledNameHash());
+    ASSERT_EQ(0x000006beu, ImmutableString("clamp(10D10D10D").mangledNameHash());
     ASSERT_EQ(0x0000033bu, ImmutableString("clamp(20D20D20D").mangledNameHash());
-    ASSERT_EQ(0x000005f7u, ImmutableString("clamp(30D30D30D").mangledNameHash());
+    ASSERT_EQ(0x000005f8u, ImmutableString("clamp(30D30D30D").mangledNameHash());
     ASSERT_EQ(0x0000023bu, ImmutableString("clamp(00E00E00E").mangledNameHash());
-    ASSERT_EQ(0x000005e8u, ImmutableString("clamp(10E00E00E").mangledNameHash());
-    ASSERT_EQ(0x000007feu, ImmutableString("clamp(20E00E00E").mangledNameHash());
+    ASSERT_EQ(0x000005e9u, ImmutableString("clamp(10E00E00E").mangledNameHash());
+    ASSERT_EQ(0x000007ffu, ImmutableString("clamp(20E00E00E").mangledNameHash());
     ASSERT_EQ(0x00000156u, ImmutableString("clamp(30E00E00E").mangledNameHash());
     ASSERT_EQ(0x000000b0u, ImmutableString("clamp(10E10E10E").mangledNameHash());
     ASSERT_EQ(0x000002a2u, ImmutableString("clamp(20E20E20E").mangledNameHash());
-    ASSERT_EQ(0x000006c4u, ImmutableString("clamp(30E30E30E").mangledNameHash());
+    ASSERT_EQ(0x000006c5u, ImmutableString("clamp(30E30E30E").mangledNameHash());
     ASSERT_EQ(0x00000264u, ImmutableString("mix(00B00B00B").mangledNameHash());
-    ASSERT_EQ(0x000005f5u, ImmutableString("mix(10B10B00B").mangledNameHash());
+    ASSERT_EQ(0x000005f6u, ImmutableString("mix(10B10B00B").mangledNameHash());
     ASSERT_EQ(0x0000001bu, ImmutableString("mix(20B20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000690u, ImmutableString("mix(30B30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000691u, ImmutableString("mix(30B30B00B").mangledNameHash());
     ASSERT_EQ(0x00000550u, ImmutableString("mix(10B10B10B").mangledNameHash());
     ASSERT_EQ(0x0000016au, ImmutableString("mix(20B20B20B").mangledNameHash());
     ASSERT_EQ(0x000003d6u, ImmutableString("mix(30B30B30B").mangledNameHash());
     ASSERT_EQ(0x00000429u, ImmutableString("mix(00C00C00C").mangledNameHash());
-    ASSERT_EQ(0x00000628u, ImmutableString("mix(10C10C00C").mangledNameHash());
+    ASSERT_EQ(0x00000629u, ImmutableString("mix(10C10C00C").mangledNameHash());
     ASSERT_EQ(0x00000415u, ImmutableString("mix(20C20C00C").mangledNameHash());
-    ASSERT_EQ(0x000006d1u, ImmutableString("mix(30C30C00C").mangledNameHash());
-    ASSERT_EQ(0x00000844u, ImmutableString("mix(10C10C10C").mangledNameHash());
+    ASSERT_EQ(0x000006d2u, ImmutableString("mix(30C30C00C").mangledNameHash());
+    ASSERT_EQ(0x00000845u, ImmutableString("mix(10C10C10C").mangledNameHash());
     ASSERT_EQ(0x000002b6u, ImmutableString("mix(20C20C20C").mangledNameHash());
-    ASSERT_EQ(0x00000763u, ImmutableString("mix(30C30C30C").mangledNameHash());
+    ASSERT_EQ(0x00000764u, ImmutableString("mix(30C30C30C").mangledNameHash());
     ASSERT_EQ(0x00000265u, ImmutableString("mix(00B00B00F").mangledNameHash());
     ASSERT_EQ(0x0000054eu, ImmutableString("mix(10B10B10F").mangledNameHash());
     ASSERT_EQ(0x00000168u, ImmutableString("mix(20B20B20F").mangledNameHash());
     ASSERT_EQ(0x000003d5u, ImmutableString("mix(30B30B30F").mangledNameHash());
     ASSERT_EQ(0x00000183u, ImmutableString("mix(00C00C00F").mangledNameHash());
-    ASSERT_EQ(0x000005a0u, ImmutableString("mix(10C10C10F").mangledNameHash());
+    ASSERT_EQ(0x000005a1u, ImmutableString("mix(10C10C10F").mangledNameHash());
     ASSERT_EQ(0x000002b3u, ImmutableString("mix(20C20C20F").mangledNameHash());
-    ASSERT_EQ(0x00000762u, ImmutableString("mix(30C30C30F").mangledNameHash());
+    ASSERT_EQ(0x00000763u, ImmutableString("mix(30C30C30F").mangledNameHash());
     ASSERT_EQ(0x00000304u, ImmutableString("mix(00D00D00F").mangledNameHash());
     ASSERT_EQ(0x000002d7u, ImmutableString("mix(10D10D10F").mangledNameHash());
     ASSERT_EQ(0x00000038u, ImmutableString("mix(20D20D20F").mangledNameHash());
     ASSERT_EQ(0x0000012du, ImmutableString("mix(30D30D30F").mangledNameHash());
     ASSERT_EQ(0x00000302u, ImmutableString("mix(00E00E00F").mangledNameHash());
-    ASSERT_EQ(0x000007e5u, ImmutableString("mix(10E10E10F").mangledNameHash());
+    ASSERT_EQ(0x000007e6u, ImmutableString("mix(10E10E10F").mangledNameHash());
     ASSERT_EQ(0x0000042bu, ImmutableString("mix(20E20E20F").mangledNameHash());
     ASSERT_EQ(0x0000027au, ImmutableString("mix(30E30E30F").mangledNameHash());
     ASSERT_EQ(0x00000192u, ImmutableString("mix(00F00F00F").mangledNameHash());
     ASSERT_EQ(0x000003e4u, ImmutableString("mix(10F10F10F").mangledNameHash());
     ASSERT_EQ(0x000001c7u, ImmutableString("mix(20F20F20F").mangledNameHash());
     ASSERT_EQ(0x0000025cu, ImmutableString("mix(30F30F30F").mangledNameHash());
-    ASSERT_EQ(0x00000741u, ImmutableString("step(00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000742u, ImmutableString("step(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000179u, ImmutableString("step(10B10B").mangledNameHash());
     ASSERT_EQ(0x00000093u, ImmutableString("step(20B20B").mangledNameHash());
     ASSERT_EQ(0x00000378u, ImmutableString("step(30B30B").mangledNameHash());
-    ASSERT_EQ(0x000006acu, ImmutableString("step(00B10B").mangledNameHash());
+    ASSERT_EQ(0x000006adu, ImmutableString("step(00B10B").mangledNameHash());
     ASSERT_EQ(0x00000457u, ImmutableString("step(00B20B").mangledNameHash());
     ASSERT_EQ(0x0000038du, ImmutableString("step(00B30B").mangledNameHash());
     ASSERT_EQ(0x00000075u, ImmutableString("step(00C00C").mangledNameHash());
@@ -330,14 +330,14 @@
     ASSERT_EQ(0x0000010du, ImmutableString("step(00C10C").mangledNameHash());
     ASSERT_EQ(0x00000391u, ImmutableString("step(00C20C").mangledNameHash());
     ASSERT_EQ(0x00000459u, ImmutableString("step(00C30C").mangledNameHash());
-    ASSERT_EQ(0x0000079du, ImmutableString("smoothstep(00C00C00C").mangledNameHash());
+    ASSERT_EQ(0x0000079eu, ImmutableString("smoothstep(00C00C00C").mangledNameHash());
     ASSERT_EQ(0x00000258u, ImmutableString("smoothstep(10C10C10C").mangledNameHash());
     ASSERT_EQ(0x0000054au, ImmutableString("smoothstep(20C20C20C").mangledNameHash());
     ASSERT_EQ(0x00000511u, ImmutableString("smoothstep(30C30C30C").mangledNameHash());
-    ASSERT_EQ(0x000006fbu, ImmutableString("smoothstep(00C00C10C").mangledNameHash());
+    ASSERT_EQ(0x000006fcu, ImmutableString("smoothstep(00C00C10C").mangledNameHash());
     ASSERT_EQ(0x0000008du, ImmutableString("smoothstep(00C00C20C").mangledNameHash());
-    ASSERT_EQ(0x000007cbu, ImmutableString("smoothstep(00C00C30C").mangledNameHash());
-    ASSERT_EQ(0x00000611u, ImmutableString("smoothstep(00B00B00B").mangledNameHash());
+    ASSERT_EQ(0x000007ccu, ImmutableString("smoothstep(00C00C30C").mangledNameHash());
+    ASSERT_EQ(0x00000612u, ImmutableString("smoothstep(00B00B00B").mangledNameHash());
     ASSERT_EQ(0x00000352u, ImmutableString("smoothstep(10B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000217u, ImmutableString("smoothstep(20B20B20B").mangledNameHash());
     ASSERT_EQ(0x000001e1u, ImmutableString("smoothstep(30B30B30B").mangledNameHash());
@@ -346,27 +346,27 @@
     ASSERT_EQ(0x000001c8u, ImmutableString("smoothstep(00B00B30B").mangledNameHash());
     ASSERT_EQ(0x00000442u, ImmutableString("modf(00B00B").mangledNameHash());
     ASSERT_EQ(0x00000056u, ImmutableString("modf(10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000597u, ImmutableString("modf(20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000598u, ImmutableString("modf(20B20B").mangledNameHash());
     ASSERT_EQ(0x000002ddu, ImmutableString("modf(30B30B").mangledNameHash());
-    ASSERT_EQ(0x000005ddu, ImmutableString("modf(00C00C").mangledNameHash());
+    ASSERT_EQ(0x000005deu, ImmutableString("modf(00C00C").mangledNameHash());
     ASSERT_EQ(0x00000406u, ImmutableString("modf(10C10C").mangledNameHash());
     ASSERT_EQ(0x00000437u, ImmutableString("modf(20C20C").mangledNameHash());
     ASSERT_EQ(0x000002f7u, ImmutableString("modf(30C30C").mangledNameHash());
     ASSERT_EQ(0x0000035bu, ImmutableString("isnan(00B").mangledNameHash());
     ASSERT_EQ(0x0000041eu, ImmutableString("isnan(10B").mangledNameHash());
-    ASSERT_EQ(0x00000710u, ImmutableString("isnan(20B").mangledNameHash());
+    ASSERT_EQ(0x00000711u, ImmutableString("isnan(20B").mangledNameHash());
     ASSERT_EQ(0x0000044fu, ImmutableString("isnan(30B").mangledNameHash());
     ASSERT_EQ(0x0000035cu, ImmutableString("isnan(00C").mangledNameHash());
     ASSERT_EQ(0x0000041du, ImmutableString("isnan(10C").mangledNameHash());
-    ASSERT_EQ(0x00000711u, ImmutableString("isnan(20C").mangledNameHash());
-    ASSERT_EQ(0x000007b9u, ImmutableString("isnan(30C").mangledNameHash());
+    ASSERT_EQ(0x00000712u, ImmutableString("isnan(20C").mangledNameHash());
+    ASSERT_EQ(0x000007bau, ImmutableString("isnan(30C").mangledNameHash());
     ASSERT_EQ(0x000000fau, ImmutableString("isinf(00B").mangledNameHash());
     ASSERT_EQ(0x000001abu, ImmutableString("isinf(10B").mangledNameHash());
-    ASSERT_EQ(0x00000829u, ImmutableString("isinf(20B").mangledNameHash());
+    ASSERT_EQ(0x0000082au, ImmutableString("isinf(20B").mangledNameHash());
     ASSERT_EQ(0x0000007eu, ImmutableString("isinf(30B").mangledNameHash());
     ASSERT_EQ(0x000000fbu, ImmutableString("isinf(00C").mangledNameHash());
     ASSERT_EQ(0x000001aau, ImmutableString("isinf(10C").mangledNameHash());
-    ASSERT_EQ(0x00000735u, ImmutableString("isinf(20C").mangledNameHash());
+    ASSERT_EQ(0x00000736u, ImmutableString("isinf(20C").mangledNameHash());
     ASSERT_EQ(0x000002d5u, ImmutableString("isinf(30C").mangledNameHash());
     ASSERT_EQ(0x0000042fu, ImmutableString("floatBitsToInt(00B").mangledNameHash());
     ASSERT_EQ(0x0000042cu, ImmutableString("floatBitsToInt(10B").mangledNameHash());
@@ -376,15 +376,15 @@
     ASSERT_EQ(0x000004a6u, ImmutableString("floatBitsToUint(10B").mangledNameHash());
     ASSERT_EQ(0x00000034u, ImmutableString("floatBitsToUint(20B").mangledNameHash());
     ASSERT_EQ(0x0000036fu, ImmutableString("floatBitsToUint(30B").mangledNameHash());
-    ASSERT_EQ(0x000007ecu, ImmutableString("intBitsToFloat(00D").mangledNameHash());
-    ASSERT_EQ(0x00000748u, ImmutableString("intBitsToFloat(10D").mangledNameHash());
+    ASSERT_EQ(0x000007edu, ImmutableString("intBitsToFloat(00D").mangledNameHash());
+    ASSERT_EQ(0x00000749u, ImmutableString("intBitsToFloat(10D").mangledNameHash());
     ASSERT_EQ(0x000000deu, ImmutableString("intBitsToFloat(20D").mangledNameHash());
     ASSERT_EQ(0x00000164u, ImmutableString("intBitsToFloat(30D").mangledNameHash());
-    ASSERT_EQ(0x0000068bu, ImmutableString("uintBitsToFloat(00E").mangledNameHash());
-    ASSERT_EQ(0x0000071cu, ImmutableString("uintBitsToFloat(10E").mangledNameHash());
-    ASSERT_EQ(0x000007dcu, ImmutableString("uintBitsToFloat(20E").mangledNameHash());
+    ASSERT_EQ(0x0000068cu, ImmutableString("uintBitsToFloat(00E").mangledNameHash());
+    ASSERT_EQ(0x0000071du, ImmutableString("uintBitsToFloat(10E").mangledNameHash());
+    ASSERT_EQ(0x000007ddu, ImmutableString("uintBitsToFloat(20E").mangledNameHash());
     ASSERT_EQ(0x0000001eu, ImmutableString("uintBitsToFloat(30E").mangledNameHash());
-    ASSERT_EQ(0x00000835u, ImmutableString("fma(00B00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000836u, ImmutableString("fma(00B00B00B").mangledNameHash());
     ASSERT_EQ(0x00000568u, ImmutableString("fma(10B10B10B").mangledNameHash());
     ASSERT_EQ(0x0000018au, ImmutableString("fma(20B20B20B").mangledNameHash());
     ASSERT_EQ(0x00000273u, ImmutableString("fma(30B30B30B").mangledNameHash());
@@ -399,68 +399,68 @@
     ASSERT_EQ(0x00000143u, ImmutableString("frexp(00C00D").mangledNameHash());
     ASSERT_EQ(0x00000386u, ImmutableString("frexp(10C10D").mangledNameHash());
     ASSERT_EQ(0x0000011au, ImmutableString("frexp(20C20D").mangledNameHash());
-    ASSERT_EQ(0x00000843u, ImmutableString("frexp(30C30D").mangledNameHash());
+    ASSERT_EQ(0x00000844u, ImmutableString("frexp(30C30D").mangledNameHash());
     ASSERT_EQ(0x0000023du, ImmutableString("ldexp(00B00D").mangledNameHash());
-    ASSERT_EQ(0x0000080fu, ImmutableString("ldexp(10B10D").mangledNameHash());
+    ASSERT_EQ(0x00000810u, ImmutableString("ldexp(10B10D").mangledNameHash());
     ASSERT_EQ(0x000001e7u, ImmutableString("ldexp(20B20D").mangledNameHash());
     ASSERT_EQ(0x00000374u, ImmutableString("ldexp(30B30D").mangledNameHash());
-    ASSERT_EQ(0x00000664u, ImmutableString("ldexp(00C00D").mangledNameHash());
+    ASSERT_EQ(0x00000665u, ImmutableString("ldexp(00C00D").mangledNameHash());
     ASSERT_EQ(0x00000446u, ImmutableString("ldexp(10C10D").mangledNameHash());
     ASSERT_EQ(0x0000023au, ImmutableString("ldexp(20C20D").mangledNameHash());
     ASSERT_EQ(0x00000252u, ImmutableString("ldexp(30C30D").mangledNameHash());
     ASSERT_EQ(0x0000036eu, ImmutableString("packSnorm2x16(10B").mangledNameHash());
     ASSERT_EQ(0x000003afu, ImmutableString("packHalf2x16(10B").mangledNameHash());
-    ASSERT_EQ(0x00000774u, ImmutableString("unpackSnorm2x16(00E").mangledNameHash());
+    ASSERT_EQ(0x00000775u, ImmutableString("unpackSnorm2x16(00E").mangledNameHash());
     ASSERT_EQ(0x0000009fu, ImmutableString("unpackHalf2x16(00E").mangledNameHash());
     ASSERT_EQ(0x0000019du, ImmutableString("packUnorm2x16(10B").mangledNameHash());
     ASSERT_EQ(0x00000482u, ImmutableString("unpackUnorm2x16(00E").mangledNameHash());
     ASSERT_EQ(0x0000048au, ImmutableString("packUnorm4x8(30B").mangledNameHash());
-    ASSERT_EQ(0x000005f4u, ImmutableString("packSnorm4x8(30B").mangledNameHash());
-    ASSERT_EQ(0x000007ddu, ImmutableString("unpackUnorm4x8(00E").mangledNameHash());
-    ASSERT_EQ(0x00000709u, ImmutableString("unpackSnorm4x8(00E").mangledNameHash());
+    ASSERT_EQ(0x000005f5u, ImmutableString("packSnorm4x8(30B").mangledNameHash());
+    ASSERT_EQ(0x000007deu, ImmutableString("unpackUnorm4x8(00E").mangledNameHash());
+    ASSERT_EQ(0x0000070au, ImmutableString("unpackSnorm4x8(00E").mangledNameHash());
     ASSERT_EQ(0x000004f9u, ImmutableString("packDouble2x32(10E").mangledNameHash());
     ASSERT_EQ(0x0000026bu, ImmutableString("unpackDouble2x32(00C").mangledNameHash());
-    ASSERT_EQ(0x0000077cu, ImmutableString("length(00B").mangledNameHash());
-    ASSERT_EQ(0x000006e6u, ImmutableString("length(10B").mangledNameHash());
+    ASSERT_EQ(0x0000077du, ImmutableString("length(00B").mangledNameHash());
+    ASSERT_EQ(0x000006e7u, ImmutableString("length(10B").mangledNameHash());
     ASSERT_EQ(0x0000023cu, ImmutableString("length(20B").mangledNameHash());
-    ASSERT_EQ(0x0000059eu, ImmutableString("length(30B").mangledNameHash());
-    ASSERT_EQ(0x0000077du, ImmutableString("length(00C").mangledNameHash());
-    ASSERT_EQ(0x000006e5u, ImmutableString("length(10C").mangledNameHash());
+    ASSERT_EQ(0x0000059fu, ImmutableString("length(30B").mangledNameHash());
+    ASSERT_EQ(0x0000077eu, ImmutableString("length(00C").mangledNameHash());
+    ASSERT_EQ(0x000006e6u, ImmutableString("length(10C").mangledNameHash());
     ASSERT_EQ(0x00000245u, ImmutableString("length(20C").mangledNameHash());
-    ASSERT_EQ(0x0000059du, ImmutableString("length(30C").mangledNameHash());
-    ASSERT_EQ(0x000007a6u, ImmutableString("distance(00B00B").mangledNameHash());
+    ASSERT_EQ(0x0000059eu, ImmutableString("length(30C").mangledNameHash());
+    ASSERT_EQ(0x000007a7u, ImmutableString("distance(00B00B").mangledNameHash());
     ASSERT_EQ(0x000000cfu, ImmutableString("distance(10B10B").mangledNameHash());
     ASSERT_EQ(0x0000053eu, ImmutableString("distance(20B20B").mangledNameHash());
     ASSERT_EQ(0x000004d3u, ImmutableString("distance(30B30B").mangledNameHash());
     ASSERT_EQ(0x0000044eu, ImmutableString("distance(00C00C").mangledNameHash());
     ASSERT_EQ(0x0000032bu, ImmutableString("distance(10C10C").mangledNameHash());
-    ASSERT_EQ(0x000007a0u, ImmutableString("distance(20C20C").mangledNameHash());
+    ASSERT_EQ(0x000007a1u, ImmutableString("distance(20C20C").mangledNameHash());
     ASSERT_EQ(0x00000574u, ImmutableString("distance(30C30C").mangledNameHash());
-    ASSERT_EQ(0x000006ebu, ImmutableString("dot(00B00B").mangledNameHash());
+    ASSERT_EQ(0x000006ecu, ImmutableString("dot(00B00B").mangledNameHash());
     ASSERT_EQ(0x000002c3u, ImmutableString("dot(10B10B").mangledNameHash());
     ASSERT_EQ(0x000003f0u, ImmutableString("dot(20B20B").mangledNameHash());
     ASSERT_EQ(0x000004e1u, ImmutableString("dot(30B30B").mangledNameHash());
     ASSERT_EQ(0x00000392u, ImmutableString("dot(00C00C").mangledNameHash());
-    ASSERT_EQ(0x00000739u, ImmutableString("dot(10C10C").mangledNameHash());
-    ASSERT_EQ(0x0000064bu, ImmutableString("dot(20C20C").mangledNameHash());
-    ASSERT_EQ(0x0000060bu, ImmutableString("dot(30C30C").mangledNameHash());
-    ASSERT_EQ(0x000005b6u, ImmutableString("cross(20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000073au, ImmutableString("dot(10C10C").mangledNameHash());
+    ASSERT_EQ(0x0000064cu, ImmutableString("dot(20C20C").mangledNameHash());
+    ASSERT_EQ(0x0000060cu, ImmutableString("dot(30C30C").mangledNameHash());
+    ASSERT_EQ(0x000005b7u, ImmutableString("cross(20B20B").mangledNameHash());
     ASSERT_EQ(0x0000034du, ImmutableString("cross(20C20C").mangledNameHash());
     ASSERT_EQ(0x0000049bu, ImmutableString("normalize(00B").mangledNameHash());
-    ASSERT_EQ(0x0000070eu, ImmutableString("normalize(10B").mangledNameHash());
+    ASSERT_EQ(0x0000070fu, ImmutableString("normalize(10B").mangledNameHash());
     ASSERT_EQ(0x00000115u, ImmutableString("normalize(20B").mangledNameHash());
     ASSERT_EQ(0x000003f7u, ImmutableString("normalize(30B").mangledNameHash());
     ASSERT_EQ(0x0000049cu, ImmutableString("normalize(00C").mangledNameHash());
-    ASSERT_EQ(0x00000708u, ImmutableString("normalize(10C").mangledNameHash());
+    ASSERT_EQ(0x00000709u, ImmutableString("normalize(10C").mangledNameHash());
     ASSERT_EQ(0x00000116u, ImmutableString("normalize(20C").mangledNameHash());
     ASSERT_EQ(0x000003f6u, ImmutableString("normalize(30C").mangledNameHash());
-    ASSERT_EQ(0x000005d1u, ImmutableString("faceforward(00B00B00B").mangledNameHash());
+    ASSERT_EQ(0x000005d2u, ImmutableString("faceforward(00B00B00B").mangledNameHash());
     ASSERT_EQ(0x000003a3u, ImmutableString("faceforward(10B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000187u, ImmutableString("faceforward(20B20B20B").mangledNameHash());
-    ASSERT_EQ(0x0000079fu, ImmutableString("faceforward(30B30B30B").mangledNameHash());
+    ASSERT_EQ(0x000007a0u, ImmutableString("faceforward(30B30B30B").mangledNameHash());
     ASSERT_EQ(0x00000316u, ImmutableString("faceforward(00C00C00C").mangledNameHash());
-    ASSERT_EQ(0x00000687u, ImmutableString("faceforward(10C10C10C").mangledNameHash());
-    ASSERT_EQ(0x00000750u, ImmutableString("faceforward(20C20C20C").mangledNameHash());
+    ASSERT_EQ(0x00000688u, ImmutableString("faceforward(10C10C10C").mangledNameHash());
+    ASSERT_EQ(0x00000751u, ImmutableString("faceforward(20C20C20C").mangledNameHash());
     ASSERT_EQ(0x00000535u, ImmutableString("faceforward(30C30C30C").mangledNameHash());
     ASSERT_EQ(0x0000029cu, ImmutableString("reflect(00B00B").mangledNameHash());
     ASSERT_EQ(0x000002b0u, ImmutableString("reflect(10B10B").mangledNameHash());
@@ -468,82 +468,82 @@
     ASSERT_EQ(0x0000052bu, ImmutableString("reflect(30B30B").mangledNameHash());
     ASSERT_EQ(0x00000162u, ImmutableString("reflect(00C00C").mangledNameHash());
     ASSERT_EQ(0x0000054fu, ImmutableString("reflect(10C10C").mangledNameHash());
-    ASSERT_EQ(0x0000069du, ImmutableString("reflect(20C20C").mangledNameHash());
+    ASSERT_EQ(0x0000069eu, ImmutableString("reflect(20C20C").mangledNameHash());
     ASSERT_EQ(0x000004f4u, ImmutableString("reflect(30C30C").mangledNameHash());
     ASSERT_EQ(0x00000105u, ImmutableString("refract(00B00B00B").mangledNameHash());
     ASSERT_EQ(0x000002b1u, ImmutableString("refract(10B10B00B").mangledNameHash());
     ASSERT_EQ(0x0000031du, ImmutableString("refract(20B20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000586u, ImmutableString("refract(30B30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000725u, ImmutableString("refract(00C00C00B").mangledNameHash());
+    ASSERT_EQ(0x00000587u, ImmutableString("refract(30B30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000726u, ImmutableString("refract(00C00C00B").mangledNameHash());
     ASSERT_EQ(0x0000035fu, ImmutableString("refract(10C10C00B").mangledNameHash());
-    ASSERT_EQ(0x00000657u, ImmutableString("refract(20C20C00B").mangledNameHash());
+    ASSERT_EQ(0x00000658u, ImmutableString("refract(20C20C00B").mangledNameHash());
     ASSERT_EQ(0x0000036cu, ImmutableString("refract(30C30C00B").mangledNameHash());
     ASSERT_EQ(0x000002ceu, ImmutableString("ftransform(").mangledNameHash());
     ASSERT_EQ(0x000001ffu, ImmutableString("matrixCompMult(50B50B").mangledNameHash());
-    ASSERT_EQ(0x000006f2u, ImmutableString("matrixCompMult(A0BA0B").mangledNameHash());
-    ASSERT_EQ(0x0000058bu, ImmutableString("matrixCompMult(F0BF0B").mangledNameHash());
+    ASSERT_EQ(0x000006f3u, ImmutableString("matrixCompMult(A0BA0B").mangledNameHash());
+    ASSERT_EQ(0x0000058cu, ImmutableString("matrixCompMult(F0BF0B").mangledNameHash());
     ASSERT_EQ(0x00000151u, ImmutableString("matrixCompMult(90B90B").mangledNameHash());
-    ASSERT_EQ(0x00000770u, ImmutableString("matrixCompMult(60B60B").mangledNameHash());
-    ASSERT_EQ(0x00000696u, ImmutableString("matrixCompMult(D0BD0B").mangledNameHash());
-    ASSERT_EQ(0x0000071eu, ImmutableString("matrixCompMult(70B70B").mangledNameHash());
+    ASSERT_EQ(0x00000771u, ImmutableString("matrixCompMult(60B60B").mangledNameHash());
+    ASSERT_EQ(0x00000697u, ImmutableString("matrixCompMult(D0BD0B").mangledNameHash());
+    ASSERT_EQ(0x0000071fu, ImmutableString("matrixCompMult(70B70B").mangledNameHash());
     ASSERT_EQ(0x00000346u, ImmutableString("matrixCompMult(E0BE0B").mangledNameHash());
-    ASSERT_EQ(0x000005b4u, ImmutableString("matrixCompMult(B0BB0B").mangledNameHash());
+    ASSERT_EQ(0x000005b5u, ImmutableString("matrixCompMult(B0BB0B").mangledNameHash());
     ASSERT_EQ(0x000000a1u, ImmutableString("outerProduct(10B10B").mangledNameHash());
     ASSERT_EQ(0x000000bdu, ImmutableString("outerProduct(20B20B").mangledNameHash());
     ASSERT_EQ(0x0000018du, ImmutableString("outerProduct(30B30B").mangledNameHash());
-    ASSERT_EQ(0x00000733u, ImmutableString("outerProduct(20B10B").mangledNameHash());
+    ASSERT_EQ(0x00000734u, ImmutableString("outerProduct(20B10B").mangledNameHash());
     ASSERT_EQ(0x0000009cu, ImmutableString("outerProduct(10B20B").mangledNameHash());
     ASSERT_EQ(0x000002e0u, ImmutableString("outerProduct(30B10B").mangledNameHash());
     ASSERT_EQ(0x0000013fu, ImmutableString("outerProduct(10B30B").mangledNameHash());
     ASSERT_EQ(0x000000e9u, ImmutableString("outerProduct(30B20B").mangledNameHash());
     ASSERT_EQ(0x00000013u, ImmutableString("outerProduct(20B30B").mangledNameHash());
-    ASSERT_EQ(0x000007bau, ImmutableString("transpose(50B").mangledNameHash());
-    ASSERT_EQ(0x000005feu, ImmutableString("transpose(A0B").mangledNameHash());
-    ASSERT_EQ(0x000006c0u, ImmutableString("transpose(F0B").mangledNameHash());
-    ASSERT_EQ(0x000005cdu, ImmutableString("transpose(60B").mangledNameHash());
-    ASSERT_EQ(0x000006d0u, ImmutableString("transpose(90B").mangledNameHash());
-    ASSERT_EQ(0x00000680u, ImmutableString("transpose(70B").mangledNameHash());
-    ASSERT_EQ(0x000007f5u, ImmutableString("transpose(D0B").mangledNameHash());
+    ASSERT_EQ(0x000007bbu, ImmutableString("transpose(50B").mangledNameHash());
+    ASSERT_EQ(0x000005ffu, ImmutableString("transpose(A0B").mangledNameHash());
+    ASSERT_EQ(0x000006c1u, ImmutableString("transpose(F0B").mangledNameHash());
+    ASSERT_EQ(0x000005ceu, ImmutableString("transpose(60B").mangledNameHash());
+    ASSERT_EQ(0x000006d1u, ImmutableString("transpose(90B").mangledNameHash());
+    ASSERT_EQ(0x00000681u, ImmutableString("transpose(70B").mangledNameHash());
+    ASSERT_EQ(0x000007f6u, ImmutableString("transpose(D0B").mangledNameHash());
     ASSERT_EQ(0x000001c5u, ImmutableString("transpose(B0B").mangledNameHash());
     ASSERT_EQ(0x00000050u, ImmutableString("transpose(E0B").mangledNameHash());
     ASSERT_EQ(0x00000059u, ImmutableString("determinant(50B").mangledNameHash());
     ASSERT_EQ(0x00000449u, ImmutableString("determinant(A0B").mangledNameHash());
-    ASSERT_EQ(0x000005fdu, ImmutableString("determinant(F0B").mangledNameHash());
+    ASSERT_EQ(0x000005feu, ImmutableString("determinant(F0B").mangledNameHash());
     ASSERT_EQ(0x000002c2u, ImmutableString("inverse(50B").mangledNameHash());
     ASSERT_EQ(0x00000558u, ImmutableString("inverse(A0B").mangledNameHash());
     ASSERT_EQ(0x00000118u, ImmutableString("inverse(F0B").mangledNameHash());
     ASSERT_EQ(0x000001b6u, ImmutableString("lessThan(10B10B").mangledNameHash());
     ASSERT_EQ(0x0000005cu, ImmutableString("lessThan(20B20B").mangledNameHash());
-    ASSERT_EQ(0x000005b5u, ImmutableString("lessThan(30B30B").mangledNameHash());
+    ASSERT_EQ(0x000005b6u, ImmutableString("lessThan(30B30B").mangledNameHash());
     ASSERT_EQ(0x000004fdu, ImmutableString("lessThan(10D10D").mangledNameHash());
     ASSERT_EQ(0x00000079u, ImmutableString("lessThan(20D20D").mangledNameHash());
-    ASSERT_EQ(0x00000775u, ImmutableString("lessThan(30D30D").mangledNameHash());
+    ASSERT_EQ(0x00000776u, ImmutableString("lessThan(30D30D").mangledNameHash());
     ASSERT_EQ(0x0000006eu, ImmutableString("lessThan(10E10E").mangledNameHash());
-    ASSERT_EQ(0x000005c2u, ImmutableString("lessThan(20E20E").mangledNameHash());
-    ASSERT_EQ(0x0000067eu, ImmutableString("lessThan(30E30E").mangledNameHash());
+    ASSERT_EQ(0x000005c3u, ImmutableString("lessThan(20E20E").mangledNameHash());
+    ASSERT_EQ(0x0000067fu, ImmutableString("lessThan(30E30E").mangledNameHash());
     ASSERT_EQ(0x00000260u, ImmutableString("lessThanEqual(10B10B").mangledNameHash());
     ASSERT_EQ(0x00000255u, ImmutableString("lessThanEqual(20B20B").mangledNameHash());
     ASSERT_EQ(0x0000000fu, ImmutableString("lessThanEqual(30B30B").mangledNameHash());
-    ASSERT_EQ(0x0000061fu, ImmutableString("lessThanEqual(10D10D").mangledNameHash());
+    ASSERT_EQ(0x00000620u, ImmutableString("lessThanEqual(10D10D").mangledNameHash());
     ASSERT_EQ(0x000001beu, ImmutableString("lessThanEqual(20D20D").mangledNameHash());
     ASSERT_EQ(0x00000451u, ImmutableString("lessThanEqual(30D30D").mangledNameHash());
     ASSERT_EQ(0x0000015du, ImmutableString("lessThanEqual(10E10E").mangledNameHash());
-    ASSERT_EQ(0x000007d5u, ImmutableString("lessThanEqual(20E20E").mangledNameHash());
+    ASSERT_EQ(0x000007d6u, ImmutableString("lessThanEqual(20E20E").mangledNameHash());
     ASSERT_EQ(0x00000083u, ImmutableString("lessThanEqual(30E30E").mangledNameHash());
     ASSERT_EQ(0x00000428u, ImmutableString("greaterThan(10B10B").mangledNameHash());
-    ASSERT_EQ(0x000007c1u, ImmutableString("greaterThan(20B20B").mangledNameHash());
+    ASSERT_EQ(0x000007c2u, ImmutableString("greaterThan(20B20B").mangledNameHash());
     ASSERT_EQ(0x00000185u, ImmutableString("greaterThan(30B30B").mangledNameHash());
-    ASSERT_EQ(0x000006dbu, ImmutableString("greaterThan(10D10D").mangledNameHash());
-    ASSERT_EQ(0x000006e0u, ImmutableString("greaterThan(20D20D").mangledNameHash());
+    ASSERT_EQ(0x000006dcu, ImmutableString("greaterThan(10D10D").mangledNameHash());
+    ASSERT_EQ(0x000006e1u, ImmutableString("greaterThan(20D20D").mangledNameHash());
     ASSERT_EQ(0x0000008au, ImmutableString("greaterThan(30D30D").mangledNameHash());
     ASSERT_EQ(0x00000213u, ImmutableString("greaterThan(10E10E").mangledNameHash());
     ASSERT_EQ(0x00000103u, ImmutableString("greaterThan(20E20E").mangledNameHash());
     ASSERT_EQ(0x0000011fu, ImmutableString("greaterThan(30E30E").mangledNameHash());
-    ASSERT_EQ(0x000006bbu, ImmutableString("greaterThanEqual(10B10B").mangledNameHash());
+    ASSERT_EQ(0x000006bcu, ImmutableString("greaterThanEqual(10B10B").mangledNameHash());
     ASSERT_EQ(0x0000002cu, ImmutableString("greaterThanEqual(20B20B").mangledNameHash());
     ASSERT_EQ(0x000001aeu, ImmutableString("greaterThanEqual(30B30B").mangledNameHash());
     ASSERT_EQ(0x000000d6u, ImmutableString("greaterThanEqual(10D10D").mangledNameHash());
-    ASSERT_EQ(0x000007bbu, ImmutableString("greaterThanEqual(20D20D").mangledNameHash());
+    ASSERT_EQ(0x000007bcu, ImmutableString("greaterThanEqual(20D20D").mangledNameHash());
     ASSERT_EQ(0x000001e8u, ImmutableString("greaterThanEqual(30D30D").mangledNameHash());
     ASSERT_EQ(0x00000024u, ImmutableString("greaterThanEqual(10E10E").mangledNameHash());
     ASSERT_EQ(0x000002d2u, ImmutableString("greaterThanEqual(20E20E").mangledNameHash());
@@ -552,24 +552,24 @@
     ASSERT_EQ(0x000002fbu, ImmutableString("equal(20B20B").mangledNameHash());
     ASSERT_EQ(0x00000200u, ImmutableString("equal(30B30B").mangledNameHash());
     ASSERT_EQ(0x00000046u, ImmutableString("equal(10D10D").mangledNameHash());
-    ASSERT_EQ(0x000007e3u, ImmutableString("equal(20D20D").mangledNameHash());
+    ASSERT_EQ(0x000007e4u, ImmutableString("equal(20D20D").mangledNameHash());
     ASSERT_EQ(0x0000036du, ImmutableString("equal(30D30D").mangledNameHash());
-    ASSERT_EQ(0x00000633u, ImmutableString("equal(10E10E").mangledNameHash());
+    ASSERT_EQ(0x00000634u, ImmutableString("equal(10E10E").mangledNameHash());
     ASSERT_EQ(0x0000014bu, ImmutableString("equal(20E20E").mangledNameHash());
     ASSERT_EQ(0x0000038fu, ImmutableString("equal(30E30E").mangledNameHash());
     ASSERT_EQ(0x0000051eu, ImmutableString("equal(10F10F").mangledNameHash());
     ASSERT_EQ(0x00000413u, ImmutableString("equal(20F20F").mangledNameHash());
-    ASSERT_EQ(0x000005c4u, ImmutableString("equal(30F30F").mangledNameHash());
-    ASSERT_EQ(0x00000778u, ImmutableString("notEqual(10B10B").mangledNameHash());
+    ASSERT_EQ(0x000005c5u, ImmutableString("equal(30F30F").mangledNameHash());
+    ASSERT_EQ(0x00000779u, ImmutableString("notEqual(10B10B").mangledNameHash());
     ASSERT_EQ(0x00000364u, ImmutableString("notEqual(20B20B").mangledNameHash());
     ASSERT_EQ(0x0000030du, ImmutableString("notEqual(30B30B").mangledNameHash());
     ASSERT_EQ(0x00000396u, ImmutableString("notEqual(10D10D").mangledNameHash());
     ASSERT_EQ(0x00000443u, ImmutableString("notEqual(20D20D").mangledNameHash());
     ASSERT_EQ(0x000004bcu, ImmutableString("notEqual(30D30D").mangledNameHash());
-    ASSERT_EQ(0x0000063bu, ImmutableString("notEqual(10E10E").mangledNameHash());
+    ASSERT_EQ(0x0000063cu, ImmutableString("notEqual(10E10E").mangledNameHash());
     ASSERT_EQ(0x00000556u, ImmutableString("notEqual(20E20E").mangledNameHash());
     ASSERT_EQ(0x0000015cu, ImmutableString("notEqual(30E30E").mangledNameHash());
-    ASSERT_EQ(0x0000060fu, ImmutableString("notEqual(10F10F").mangledNameHash());
+    ASSERT_EQ(0x00000610u, ImmutableString("notEqual(10F10F").mangledNameHash());
     ASSERT_EQ(0x000004b7u, ImmutableString("notEqual(20F20F").mangledNameHash());
     ASSERT_EQ(0x000003beu, ImmutableString("notEqual(30F30F").mangledNameHash());
     ASSERT_EQ(0x0000016bu, ImmutableString("any(10F").mangledNameHash());
@@ -580,23 +580,23 @@
     ASSERT_EQ(0x00000464u, ImmutableString("all(30F").mangledNameHash());
     ASSERT_EQ(0x0000000du, ImmutableString("not(10F").mangledNameHash());
     ASSERT_EQ(0x000000b7u, ImmutableString("not(20F").mangledNameHash());
-    ASSERT_EQ(0x00000817u, ImmutableString("not(30F").mangledNameHash());
-    ASSERT_EQ(0x000005c7u, ImmutableString("bitfieldExtract(00D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000818u, ImmutableString("not(30F").mangledNameHash());
+    ASSERT_EQ(0x000005c8u, ImmutableString("bitfieldExtract(00D00D00D").mangledNameHash());
     ASSERT_EQ(0x000000f1u, ImmutableString("bitfieldExtract(10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000129u, ImmutableString("bitfieldExtract(20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000007e8u, ImmutableString("bitfieldExtract(30D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000007e9u, ImmutableString("bitfieldExtract(30D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000572u, ImmutableString("bitfieldExtract(00E00D00D").mangledNameHash());
-    ASSERT_EQ(0x000006dcu, ImmutableString("bitfieldExtract(10E00D00D").mangledNameHash());
-    ASSERT_EQ(0x000007dbu, ImmutableString("bitfieldExtract(20E00D00D").mangledNameHash());
+    ASSERT_EQ(0x000006ddu, ImmutableString("bitfieldExtract(10E00D00D").mangledNameHash());
+    ASSERT_EQ(0x000007dcu, ImmutableString("bitfieldExtract(20E00D00D").mangledNameHash());
     ASSERT_EQ(0x000000d4u, ImmutableString("bitfieldExtract(30E00D00D").mangledNameHash());
     ASSERT_EQ(0x0000023fu, ImmutableString("bitfieldInsert(00D00D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000617u, ImmutableString("bitfieldInsert(10D10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000068fu, ImmutableString("bitfieldInsert(20D20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000006d9u, ImmutableString("bitfieldInsert(30D30D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000006a0u, ImmutableString("bitfieldInsert(00E00E00D00D").mangledNameHash());
-    ASSERT_EQ(0x000005f3u, ImmutableString("bitfieldInsert(10E10E00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000790u, ImmutableString("bitfieldInsert(20E20E00D00D").mangledNameHash());
-    ASSERT_EQ(0x000007dau, ImmutableString("bitfieldInsert(30E30E00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000618u, ImmutableString("bitfieldInsert(10D10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000690u, ImmutableString("bitfieldInsert(20D20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000006dau, ImmutableString("bitfieldInsert(30D30D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000006a1u, ImmutableString("bitfieldInsert(00E00E00D00D").mangledNameHash());
+    ASSERT_EQ(0x000005f4u, ImmutableString("bitfieldInsert(10E10E00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000791u, ImmutableString("bitfieldInsert(20E20E00D00D").mangledNameHash());
+    ASSERT_EQ(0x000007dbu, ImmutableString("bitfieldInsert(30E30E00D00D").mangledNameHash());
     ASSERT_EQ(0x000000d2u, ImmutableString("bitfieldReverse(00D").mangledNameHash());
     ASSERT_EQ(0x0000017eu, ImmutableString("bitfieldReverse(10D").mangledNameHash());
     ASSERT_EQ(0x0000046au, ImmutableString("bitfieldReverse(20D").mangledNameHash());
@@ -613,51 +613,51 @@
     ASSERT_EQ(0x0000018fu, ImmutableString("bitCount(10E").mangledNameHash());
     ASSERT_EQ(0x0000053bu, ImmutableString("bitCount(20E").mangledNameHash());
     ASSERT_EQ(0x00000480u, ImmutableString("bitCount(30E").mangledNameHash());
-    ASSERT_EQ(0x000005bbu, ImmutableString("findLSB(00D").mangledNameHash());
-    ASSERT_EQ(0x0000074au, ImmutableString("findLSB(10D").mangledNameHash());
-    ASSERT_EQ(0x000006b6u, ImmutableString("findLSB(20D").mangledNameHash());
+    ASSERT_EQ(0x000005bcu, ImmutableString("findLSB(00D").mangledNameHash());
+    ASSERT_EQ(0x0000074bu, ImmutableString("findLSB(10D").mangledNameHash());
+    ASSERT_EQ(0x000006b7u, ImmutableString("findLSB(20D").mangledNameHash());
     ASSERT_EQ(0x0000039cu, ImmutableString("findLSB(30D").mangledNameHash());
-    ASSERT_EQ(0x000007eeu, ImmutableString("findLSB(00E").mangledNameHash());
+    ASSERT_EQ(0x000007efu, ImmutableString("findLSB(00E").mangledNameHash());
     ASSERT_EQ(0x000001eau, ImmutableString("findLSB(10E").mangledNameHash());
-    ASSERT_EQ(0x000006b5u, ImmutableString("findLSB(20E").mangledNameHash());
+    ASSERT_EQ(0x000006b6u, ImmutableString("findLSB(20E").mangledNameHash());
     ASSERT_EQ(0x0000039du, ImmutableString("findLSB(30E").mangledNameHash());
-    ASSERT_EQ(0x0000083fu, ImmutableString("findMSB(00D").mangledNameHash());
+    ASSERT_EQ(0x00000840u, ImmutableString("findMSB(00D").mangledNameHash());
     ASSERT_EQ(0x00000096u, ImmutableString("findMSB(10D").mangledNameHash());
-    ASSERT_EQ(0x00000702u, ImmutableString("findMSB(20D").mangledNameHash());
-    ASSERT_EQ(0x000007b1u, ImmutableString("findMSB(30D").mangledNameHash());
-    ASSERT_EQ(0x00000840u, ImmutableString("findMSB(00E").mangledNameHash());
+    ASSERT_EQ(0x00000703u, ImmutableString("findMSB(20D").mangledNameHash());
+    ASSERT_EQ(0x000007b2u, ImmutableString("findMSB(30D").mangledNameHash());
+    ASSERT_EQ(0x00000841u, ImmutableString("findMSB(00E").mangledNameHash());
     ASSERT_EQ(0x00000095u, ImmutableString("findMSB(10E").mangledNameHash());
     ASSERT_EQ(0x0000000eu, ImmutableString("findMSB(20E").mangledNameHash());
-    ASSERT_EQ(0x000007b0u, ImmutableString("findMSB(30E").mangledNameHash());
+    ASSERT_EQ(0x000007b1u, ImmutableString("findMSB(30E").mangledNameHash());
     ASSERT_EQ(0x0000014cu, ImmutableString("uaddCarry(00E00E00E").mangledNameHash());
-    ASSERT_EQ(0x00000625u, ImmutableString("uaddCarry(10E10E10E").mangledNameHash());
+    ASSERT_EQ(0x00000626u, ImmutableString("uaddCarry(10E10E10E").mangledNameHash());
     ASSERT_EQ(0x00000227u, ImmutableString("uaddCarry(20E20E20E").mangledNameHash());
     ASSERT_EQ(0x00000540u, ImmutableString("uaddCarry(30E30E30E").mangledNameHash());
     ASSERT_EQ(0x0000055du, ImmutableString("usubBorrow(00E00E00E").mangledNameHash());
     ASSERT_EQ(0x00000416u, ImmutableString("usubBorrow(10E10E10E").mangledNameHash());
     ASSERT_EQ(0x000004e7u, ImmutableString("usubBorrow(20E20E20E").mangledNameHash());
-    ASSERT_EQ(0x000005adu, ImmutableString("usubBorrow(30E30E30E").mangledNameHash());
-    ASSERT_EQ(0x00000808u, ImmutableString("umulExtended(00E00E00E00E").mangledNameHash());
-    ASSERT_EQ(0x0000058cu, ImmutableString("umulExtended(10E10E10E10E").mangledNameHash());
+    ASSERT_EQ(0x000005aeu, ImmutableString("usubBorrow(30E30E30E").mangledNameHash());
+    ASSERT_EQ(0x00000809u, ImmutableString("umulExtended(00E00E00E00E").mangledNameHash());
+    ASSERT_EQ(0x0000058du, ImmutableString("umulExtended(10E10E10E10E").mangledNameHash());
     ASSERT_EQ(0x0000019fu, ImmutableString("umulExtended(20E20E20E20E").mangledNameHash());
-    ASSERT_EQ(0x00000590u, ImmutableString("umulExtended(30E30E30E30E").mangledNameHash());
-    ASSERT_EQ(0x00000681u, ImmutableString("imulExtended(00D00D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000591u, ImmutableString("umulExtended(30E30E30E30E").mangledNameHash());
+    ASSERT_EQ(0x00000682u, ImmutableString("imulExtended(00D00D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000035du, ImmutableString("imulExtended(10D10D10D10D").mangledNameHash());
     ASSERT_EQ(0x000004d1u, ImmutableString("imulExtended(20D20D20D20D").mangledNameHash());
-    ASSERT_EQ(0x0000067fu, ImmutableString("imulExtended(30D30D30D30D").mangledNameHash());
+    ASSERT_EQ(0x00000680u, ImmutableString("imulExtended(30D30D30D30D").mangledNameHash());
     ASSERT_EQ(0x0000028du, ImmutableString("texture2D(00I10B").mangledNameHash());
     ASSERT_EQ(0x00000004u, ImmutableString("texture2DProj(00I20B").mangledNameHash());
     ASSERT_EQ(0x00000361u, ImmutableString("texture2DProj(00I30B").mangledNameHash());
     ASSERT_EQ(0x0000014eu, ImmutableString("textureCube(00K20B").mangledNameHash());
     ASSERT_EQ(0x00000385u, ImmutableString("texture1D(00g00B").mangledNameHash());
-    ASSERT_EQ(0x0000067du, ImmutableString("texture1DProj(00g10B").mangledNameHash());
+    ASSERT_EQ(0x0000067eu, ImmutableString("texture1DProj(00g10B").mangledNameHash());
     ASSERT_EQ(0x00000524u, ImmutableString("texture1DProj(00g30B").mangledNameHash());
-    ASSERT_EQ(0x0000074du, ImmutableString("texture3D(00J20B").mangledNameHash());
-    ASSERT_EQ(0x000005b3u, ImmutableString("texture3DProj(00J30B").mangledNameHash());
-    ASSERT_EQ(0x00000801u, ImmutableString("shadow1D(00m20B").mangledNameHash());
-    ASSERT_EQ(0x00000833u, ImmutableString("shadow1DProj(00m30B").mangledNameHash());
+    ASSERT_EQ(0x0000074eu, ImmutableString("texture3D(00J20B").mangledNameHash());
+    ASSERT_EQ(0x000005b4u, ImmutableString("texture3DProj(00J30B").mangledNameHash());
+    ASSERT_EQ(0x00000802u, ImmutableString("shadow1D(00m20B").mangledNameHash());
+    ASSERT_EQ(0x00000834u, ImmutableString("shadow1DProj(00m30B").mangledNameHash());
     ASSERT_EQ(0x0000039fu, ImmutableString("shadow2D(00d20B").mangledNameHash());
-    ASSERT_EQ(0x00000651u, ImmutableString("shadow2DProj(00d30B").mangledNameHash());
+    ASSERT_EQ(0x00000652u, ImmutableString("shadow2DProj(00d30B").mangledNameHash());
     ASSERT_EQ(0x000003fcu, ImmutableString("texture2D(00M10B").mangledNameHash());
     ASSERT_EQ(0x00000395u, ImmutableString("texture2DProj(00M20B").mangledNameHash());
     ASSERT_EQ(0x00000453u, ImmutableString("texture2DProj(00M30B").mangledNameHash());
@@ -670,68 +670,68 @@
     ASSERT_EQ(0x0000026fu, ImmutableString("texture2DGradEXT(00I10B10B10B").mangledNameHash());
     ASSERT_EQ(0x000003ceu, ImmutableString("texture2DProjGradEXT(00I20B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000272u, ImmutableString("texture2DProjGradEXT(00I30B10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000075fu, ImmutableString("textureCubeGradEXT(00K20B20B20B").mangledNameHash());
-    ASSERT_EQ(0x000006dfu, ImmutableString("texture2D(00I10B00B").mangledNameHash());
+    ASSERT_EQ(0x00000760u, ImmutableString("textureCubeGradEXT(00K20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x000006e0u, ImmutableString("texture2D(00I10B00B").mangledNameHash());
     ASSERT_EQ(0x000000fdu, ImmutableString("texture2DProj(00I20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000075cu, ImmutableString("texture2DProj(00I30B00B").mangledNameHash());
+    ASSERT_EQ(0x0000075du, ImmutableString("texture2DProj(00I30B00B").mangledNameHash());
     ASSERT_EQ(0x000001b5u, ImmutableString("textureCube(00K20B00B").mangledNameHash());
     ASSERT_EQ(0x000004dcu, ImmutableString("texture3D(00J20B00B").mangledNameHash());
-    ASSERT_EQ(0x000005a6u, ImmutableString("texture3DProj(00J30B00B").mangledNameHash());
+    ASSERT_EQ(0x000005a7u, ImmutableString("texture3DProj(00J30B00B").mangledNameHash());
     ASSERT_EQ(0x00000440u, ImmutableString("texture3DLod(00J20B00B").mangledNameHash());
     ASSERT_EQ(0x000002d4u, ImmutableString("texture3DProjLod(00J30B00B").mangledNameHash());
     ASSERT_EQ(0x00000532u, ImmutableString("texture1D(00g00B00B").mangledNameHash());
     ASSERT_EQ(0x000001f8u, ImmutableString("texture1DProj(00g10B00B").mangledNameHash());
-    ASSERT_EQ(0x000005dau, ImmutableString("texture1DProj(00g30B00B").mangledNameHash());
+    ASSERT_EQ(0x000005dbu, ImmutableString("texture1DProj(00g30B00B").mangledNameHash());
     ASSERT_EQ(0x000000adu, ImmutableString("shadow1D(00m20B00B").mangledNameHash());
     ASSERT_EQ(0x000004e9u, ImmutableString("shadow1DProj(00m30B00B").mangledNameHash());
     ASSERT_EQ(0x0000022bu, ImmutableString("shadow2D(00d20B00B").mangledNameHash());
-    ASSERT_EQ(0x000007f1u, ImmutableString("shadow2DProj(00d30B00B").mangledNameHash());
-    ASSERT_EQ(0x000005bau, ImmutableString("dFdx(00B").mangledNameHash());
+    ASSERT_EQ(0x000007f2u, ImmutableString("shadow2DProj(00d30B00B").mangledNameHash());
+    ASSERT_EQ(0x000005bbu, ImmutableString("dFdx(00B").mangledNameHash());
     ASSERT_EQ(0x00000521u, ImmutableString("dFdx(10B").mangledNameHash());
-    ASSERT_EQ(0x000006fdu, ImmutableString("dFdx(20B").mangledNameHash());
-    ASSERT_EQ(0x00000670u, ImmutableString("dFdx(30B").mangledNameHash());
-    ASSERT_EQ(0x0000067bu, ImmutableString("dFdy(00B").mangledNameHash());
-    ASSERT_EQ(0x00000713u, ImmutableString("dFdy(10B").mangledNameHash());
+    ASSERT_EQ(0x000006feu, ImmutableString("dFdx(20B").mangledNameHash());
+    ASSERT_EQ(0x00000671u, ImmutableString("dFdx(30B").mangledNameHash());
+    ASSERT_EQ(0x0000067cu, ImmutableString("dFdy(00B").mangledNameHash());
+    ASSERT_EQ(0x00000714u, ImmutableString("dFdy(10B").mangledNameHash());
     ASSERT_EQ(0x000000f6u, ImmutableString("dFdy(20B").mangledNameHash());
     ASSERT_EQ(0x000001a8u, ImmutableString("dFdy(30B").mangledNameHash());
-    ASSERT_EQ(0x00000712u, ImmutableString("fwidth(00B").mangledNameHash());
-    ASSERT_EQ(0x0000067au, ImmutableString("fwidth(10B").mangledNameHash());
-    ASSERT_EQ(0x00000847u, ImmutableString("fwidth(20B").mangledNameHash());
-    ASSERT_EQ(0x000007b3u, ImmutableString("fwidth(30B").mangledNameHash());
-    ASSERT_EQ(0x00000742u, ImmutableString("texture2DLodEXT(00I10B00B").mangledNameHash());
+    ASSERT_EQ(0x00000713u, ImmutableString("fwidth(00B").mangledNameHash());
+    ASSERT_EQ(0x0000067bu, ImmutableString("fwidth(10B").mangledNameHash());
+    ASSERT_EQ(0x00000848u, ImmutableString("fwidth(20B").mangledNameHash());
+    ASSERT_EQ(0x000007b4u, ImmutableString("fwidth(30B").mangledNameHash());
+    ASSERT_EQ(0x00000743u, ImmutableString("texture2DLodEXT(00I10B00B").mangledNameHash());
     ASSERT_EQ(0x000001afu, ImmutableString("texture2DProjLodEXT(00I20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000073du, ImmutableString("texture2DProjLodEXT(00I30B00B").mangledNameHash());
+    ASSERT_EQ(0x0000073eu, ImmutableString("texture2DProjLodEXT(00I30B00B").mangledNameHash());
     ASSERT_EQ(0x00000400u, ImmutableString("textureCubeLodEXT(00K20B00B").mangledNameHash());
     ASSERT_EQ(0x00000389u, ImmutableString("texture2DLod(00I10B00B").mangledNameHash());
     ASSERT_EQ(0x00000458u, ImmutableString("texture2DProjLod(00I20B00B").mangledNameHash());
-    ASSERT_EQ(0x000005eeu, ImmutableString("texture2DProjLod(00I30B00B").mangledNameHash());
+    ASSERT_EQ(0x000005efu, ImmutableString("texture2DProjLod(00I30B00B").mangledNameHash());
     ASSERT_EQ(0x000001a3u, ImmutableString("textureCubeLod(00K20B00B").mangledNameHash());
     ASSERT_EQ(0x000004ddu, ImmutableString("texture1DLod(00g00B00B").mangledNameHash());
-    ASSERT_EQ(0x00000679u, ImmutableString("texture1DProjLod(00g10B00B").mangledNameHash());
+    ASSERT_EQ(0x0000067au, ImmutableString("texture1DProjLod(00g10B00B").mangledNameHash());
     ASSERT_EQ(0x00000502u, ImmutableString("texture1DProjLod(00g30B00B").mangledNameHash());
     ASSERT_EQ(0x0000044cu, ImmutableString("shadow1DLod(00m20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000642u, ImmutableString("shadow1DProjLod(00m30B00B").mangledNameHash());
-    ASSERT_EQ(0x0000067cu, ImmutableString("shadow2DLod(00d20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000069au, ImmutableString("shadow2DProjLod(00d30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000643u, ImmutableString("shadow1DProjLod(00m30B00B").mangledNameHash());
+    ASSERT_EQ(0x0000067du, ImmutableString("shadow2DLod(00d20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000069bu, ImmutableString("shadow2DProjLod(00d30B00B").mangledNameHash());
     ASSERT_EQ(0x00000113u, ImmutableString("texture(00I10B").mangledNameHash());
     ASSERT_EQ(0x00000174u, ImmutableString("texture(00R10B").mangledNameHash());
-    ASSERT_EQ(0x000007a3u, ImmutableString("texture(00X10B").mangledNameHash());
-    ASSERT_EQ(0x0000061eu, ImmutableString("texture(00J20B").mangledNameHash());
+    ASSERT_EQ(0x000007a4u, ImmutableString("texture(00X10B").mangledNameHash());
+    ASSERT_EQ(0x0000061fu, ImmutableString("texture(00J20B").mangledNameHash());
     ASSERT_EQ(0x000000eau, ImmutableString("texture(00S20B").mangledNameHash());
     ASSERT_EQ(0x00000289u, ImmutableString("texture(00Y20B").mangledNameHash());
-    ASSERT_EQ(0x00000813u, ImmutableString("texture(00K20B").mangledNameHash());
-    ASSERT_EQ(0x000006b1u, ImmutableString("texture(00T20B").mangledNameHash());
-    ASSERT_EQ(0x00000811u, ImmutableString("texture(00Z20B").mangledNameHash());
-    ASSERT_EQ(0x000006feu, ImmutableString("texture(00L20B").mangledNameHash());
+    ASSERT_EQ(0x00000814u, ImmutableString("texture(00K20B").mangledNameHash());
+    ASSERT_EQ(0x000006b2u, ImmutableString("texture(00T20B").mangledNameHash());
+    ASSERT_EQ(0x00000812u, ImmutableString("texture(00Z20B").mangledNameHash());
+    ASSERT_EQ(0x000006ffu, ImmutableString("texture(00L20B").mangledNameHash());
     ASSERT_EQ(0x0000008bu, ImmutableString("texture(00U20B").mangledNameHash());
-    ASSERT_EQ(0x0000080bu, ImmutableString("texture(00a20B").mangledNameHash());
+    ASSERT_EQ(0x0000080cu, ImmutableString("texture(00a20B").mangledNameHash());
     ASSERT_EQ(0x00000025u, ImmutableString("texture(00d20B").mangledNameHash());
     ASSERT_EQ(0x000001f0u, ImmutableString("texture(00e30B").mangledNameHash());
     ASSERT_EQ(0x000001ddu, ImmutableString("texture(00f30B").mangledNameHash());
-    ASSERT_EQ(0x00000824u, ImmutableString("texture(00g00B").mangledNameHash());
+    ASSERT_EQ(0x00000825u, ImmutableString("texture(00g00B").mangledNameHash());
     ASSERT_EQ(0x00000253u, ImmutableString("texture(00o00B").mangledNameHash());
     ASSERT_EQ(0x00000098u, ImmutableString("texture(00t00B").mangledNameHash());
-    ASSERT_EQ(0x00000815u, ImmutableString("texture(00m20B").mangledNameHash());
+    ASSERT_EQ(0x00000816u, ImmutableString("texture(00m20B").mangledNameHash());
     ASSERT_EQ(0x000000c0u, ImmutableString("texture(00h20B").mangledNameHash());
     ASSERT_EQ(0x000000e8u, ImmutableString("texture(00p20B").mangledNameHash());
     ASSERT_EQ(0x00000470u, ImmutableString("texture(00u20B").mangledNameHash());
@@ -739,66 +739,66 @@
     ASSERT_EQ(0x000003e0u, ImmutableString("texture(00q10B").mangledNameHash());
     ASSERT_EQ(0x00000563u, ImmutableString("texture(00v10B").mangledNameHash());
     ASSERT_EQ(0x00000239u, ImmutableString("texture(00n20B").mangledNameHash());
-    ASSERT_EQ(0x00000678u, ImmutableString("texture(00l30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000679u, ImmutableString("texture(00l30B00B").mangledNameHash());
     ASSERT_EQ(0x00000267u, ImmutableString("textureProj(00I20B").mangledNameHash());
     ASSERT_EQ(0x00000212u, ImmutableString("textureProj(00R20B").mangledNameHash());
     ASSERT_EQ(0x000002cfu, ImmutableString("textureProj(00X20B").mangledNameHash());
     ASSERT_EQ(0x00000301u, ImmutableString("textureProj(00I30B").mangledNameHash());
-    ASSERT_EQ(0x00000832u, ImmutableString("textureProj(00R30B").mangledNameHash());
-    ASSERT_EQ(0x0000083eu, ImmutableString("textureProj(00X30B").mangledNameHash());
+    ASSERT_EQ(0x00000833u, ImmutableString("textureProj(00R30B").mangledNameHash());
+    ASSERT_EQ(0x0000083fu, ImmutableString("textureProj(00X30B").mangledNameHash());
     ASSERT_EQ(0x000002e1u, ImmutableString("textureProj(00J30B").mangledNameHash());
     ASSERT_EQ(0x000001a7u, ImmutableString("textureProj(00S30B").mangledNameHash());
     ASSERT_EQ(0x000000f7u, ImmutableString("textureProj(00Y30B").mangledNameHash());
-    ASSERT_EQ(0x000007ffu, ImmutableString("textureProj(00d30B").mangledNameHash());
+    ASSERT_EQ(0x00000800u, ImmutableString("textureProj(00d30B").mangledNameHash());
     ASSERT_EQ(0x000002fau, ImmutableString("textureProj(00g10B").mangledNameHash());
-    ASSERT_EQ(0x00000656u, ImmutableString("textureProj(00o10B").mangledNameHash());
+    ASSERT_EQ(0x00000657u, ImmutableString("textureProj(00o10B").mangledNameHash());
     ASSERT_EQ(0x00000064u, ImmutableString("textureProj(00t10B").mangledNameHash());
-    ASSERT_EQ(0x000007d8u, ImmutableString("textureProj(00g30B").mangledNameHash());
+    ASSERT_EQ(0x000007d9u, ImmutableString("textureProj(00g30B").mangledNameHash());
     ASSERT_EQ(0x00000127u, ImmutableString("textureProj(00o30B").mangledNameHash());
-    ASSERT_EQ(0x00000772u, ImmutableString("textureProj(00t30B").mangledNameHash());
+    ASSERT_EQ(0x00000773u, ImmutableString("textureProj(00t30B").mangledNameHash());
     ASSERT_EQ(0x00000102u, ImmutableString("textureProj(00m30B").mangledNameHash());
     ASSERT_EQ(0x00000515u, ImmutableString("textureProj(00q20B").mangledNameHash());
-    ASSERT_EQ(0x000006abu, ImmutableString("textureProj(00v20B").mangledNameHash());
-    ASSERT_EQ(0x000005abu, ImmutableString("textureProj(00q30B").mangledNameHash());
-    ASSERT_EQ(0x00000608u, ImmutableString("textureProj(00v30B").mangledNameHash());
+    ASSERT_EQ(0x000006acu, ImmutableString("textureProj(00v20B").mangledNameHash());
+    ASSERT_EQ(0x000005acu, ImmutableString("textureProj(00q30B").mangledNameHash());
+    ASSERT_EQ(0x00000609u, ImmutableString("textureProj(00v30B").mangledNameHash());
     ASSERT_EQ(0x000000e6u, ImmutableString("textureProj(00n30B").mangledNameHash());
     ASSERT_EQ(0x000000d5u, ImmutableString("textureLod(00I10B00B").mangledNameHash());
     ASSERT_EQ(0x00000383u, ImmutableString("textureLod(00R10B00B").mangledNameHash());
     ASSERT_EQ(0x000000c6u, ImmutableString("textureLod(00X10B00B").mangledNameHash());
     ASSERT_EQ(0x000004a7u, ImmutableString("textureLod(00J20B00B").mangledNameHash());
     ASSERT_EQ(0x000003d0u, ImmutableString("textureLod(00S20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000686u, ImmutableString("textureLod(00Y20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000687u, ImmutableString("textureLod(00Y20B00B").mangledNameHash());
     ASSERT_EQ(0x00000539u, ImmutableString("textureLod(00K20B00B").mangledNameHash());
-    ASSERT_EQ(0x000006edu, ImmutableString("textureLod(00T20B00B").mangledNameHash());
-    ASSERT_EQ(0x000005cau, ImmutableString("textureLod(00Z20B00B").mangledNameHash());
+    ASSERT_EQ(0x000006eeu, ImmutableString("textureLod(00T20B00B").mangledNameHash());
+    ASSERT_EQ(0x000005cbu, ImmutableString("textureLod(00Z20B00B").mangledNameHash());
     ASSERT_EQ(0x00000233u, ImmutableString("textureLod(00L20B00B").mangledNameHash());
     ASSERT_EQ(0x00000202u, ImmutableString("textureLod(00U20B00B").mangledNameHash());
     ASSERT_EQ(0x0000036au, ImmutableString("textureLod(00a20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000717u, ImmutableString("textureLod(00d20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000577u, ImmutableString("textureLod(00g00B00B").mangledNameHash());
-    ASSERT_EQ(0x000007cdu, ImmutableString("textureLod(00o00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000718u, ImmutableString("textureLod(00d20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000578u, ImmutableString("textureLod(00g00B00B").mangledNameHash());
+    ASSERT_EQ(0x000007ceu, ImmutableString("textureLod(00o00B00B").mangledNameHash());
     ASSERT_EQ(0x00000011u, ImmutableString("textureLod(00t00B00B").mangledNameHash());
     ASSERT_EQ(0x00000338u, ImmutableString("textureLod(00m20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000729u, ImmutableString("textureLod(00h10B00B").mangledNameHash());
+    ASSERT_EQ(0x0000072au, ImmutableString("textureLod(00h10B00B").mangledNameHash());
     ASSERT_EQ(0x00000206u, ImmutableString("textureLod(00p10B00B").mangledNameHash());
     ASSERT_EQ(0x0000056cu, ImmutableString("textureLod(00u10B00B").mangledNameHash());
     ASSERT_EQ(0x00000160u, ImmutableString("textureLod(00i20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000722u, ImmutableString("textureLod(00k30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000723u, ImmutableString("textureLod(00k30B00B").mangledNameHash());
     ASSERT_EQ(0x00000309u, ImmutableString("textureLod(00s30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000785u, ImmutableString("textureLod(00x30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000786u, ImmutableString("textureLod(00x30B00B").mangledNameHash());
     ASSERT_EQ(0x000004abu, ImmutableString("textureSize(00I00D").mangledNameHash());
-    ASSERT_EQ(0x000006c5u, ImmutableString("textureSize(00R00D").mangledNameHash());
+    ASSERT_EQ(0x000006c6u, ImmutableString("textureSize(00R00D").mangledNameHash());
     ASSERT_EQ(0x00000427u, ImmutableString("textureSize(00X00D").mangledNameHash());
-    ASSERT_EQ(0x00000737u, ImmutableString("textureSize(00J00D").mangledNameHash());
+    ASSERT_EQ(0x00000738u, ImmutableString("textureSize(00J00D").mangledNameHash());
     ASSERT_EQ(0x000001d7u, ImmutableString("textureSize(00S00D").mangledNameHash());
     ASSERT_EQ(0x0000055bu, ImmutableString("textureSize(00Y00D").mangledNameHash());
     ASSERT_EQ(0x00000020u, ImmutableString("textureSize(00K00D").mangledNameHash());
     ASSERT_EQ(0x000001f2u, ImmutableString("textureSize(00T00D").mangledNameHash());
-    ASSERT_EQ(0x000007e7u, ImmutableString("textureSize(00Z00D").mangledNameHash());
+    ASSERT_EQ(0x000007e8u, ImmutableString("textureSize(00Z00D").mangledNameHash());
     ASSERT_EQ(0x000001a4u, ImmutableString("textureSize(00L00D").mangledNameHash());
     ASSERT_EQ(0x00000541u, ImmutableString("textureSize(00U00D").mangledNameHash());
     ASSERT_EQ(0x000001cfu, ImmutableString("textureSize(00a00D").mangledNameHash());
-    ASSERT_EQ(0x00000622u, ImmutableString("textureSize(00d00D").mangledNameHash());
+    ASSERT_EQ(0x00000623u, ImmutableString("textureSize(00d00D").mangledNameHash());
     ASSERT_EQ(0x0000010bu, ImmutableString("textureSize(00e00D").mangledNameHash());
     ASSERT_EQ(0x000001b8u, ImmutableString("textureSize(00f00D").mangledNameHash());
     ASSERT_EQ(0x000004feu, ImmutableString("textureSize(00g00D").mangledNameHash());
@@ -806,93 +806,93 @@
     ASSERT_EQ(0x000001dbu, ImmutableString("textureSize(00t00D").mangledNameHash());
     ASSERT_EQ(0x000002bau, ImmutableString("textureSize(00m00D").mangledNameHash());
     ASSERT_EQ(0x0000051au, ImmutableString("textureSize(00k00D").mangledNameHash());
-    ASSERT_EQ(0x00000665u, ImmutableString("textureSize(00s00D").mangledNameHash());
+    ASSERT_EQ(0x00000666u, ImmutableString("textureSize(00s00D").mangledNameHash());
     ASSERT_EQ(0x00000188u, ImmutableString("textureSize(00x00D").mangledNameHash());
-    ASSERT_EQ(0x000007ccu, ImmutableString("textureSize(00l00D").mangledNameHash());
-    ASSERT_EQ(0x00000792u, ImmutableString("textureSize(00O").mangledNameHash());
-    ASSERT_EQ(0x0000078cu, ImmutableString("textureSize(00q").mangledNameHash());
-    ASSERT_EQ(0x0000078fu, ImmutableString("textureSize(00v").mangledNameHash());
-    ASSERT_EQ(0x00000787u, ImmutableString("textureSize(00n").mangledNameHash());
+    ASSERT_EQ(0x000007cdu, ImmutableString("textureSize(00l00D").mangledNameHash());
+    ASSERT_EQ(0x00000793u, ImmutableString("textureSize(00O").mangledNameHash());
+    ASSERT_EQ(0x0000078du, ImmutableString("textureSize(00q").mangledNameHash());
+    ASSERT_EQ(0x00000790u, ImmutableString("textureSize(00v").mangledNameHash());
+    ASSERT_EQ(0x00000788u, ImmutableString("textureSize(00n").mangledNameHash());
     ASSERT_EQ(0x00000021u, ImmutableString("textureSize(00h00D").mangledNameHash());
     ASSERT_EQ(0x00000033u, ImmutableString("textureSize(00p00D").mangledNameHash());
     ASSERT_EQ(0x000001f4u, ImmutableString("textureSize(00u00D").mangledNameHash());
     ASSERT_EQ(0x0000014au, ImmutableString("textureSize(00i00D").mangledNameHash());
-    ASSERT_EQ(0x00000786u, ImmutableString("textureSize(00j").mangledNameHash());
-    ASSERT_EQ(0x0000078du, ImmutableString("textureSize(00r").mangledNameHash());
-    ASSERT_EQ(0x0000078eu, ImmutableString("textureSize(00w").mangledNameHash());
-    ASSERT_EQ(0x000006adu, ImmutableString("textureProjLod(00I20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000787u, ImmutableString("textureSize(00j").mangledNameHash());
+    ASSERT_EQ(0x0000078eu, ImmutableString("textureSize(00r").mangledNameHash());
+    ASSERT_EQ(0x0000078fu, ImmutableString("textureSize(00w").mangledNameHash());
+    ASSERT_EQ(0x000006aeu, ImmutableString("textureProjLod(00I20B00B").mangledNameHash());
     ASSERT_EQ(0x000004bbu, ImmutableString("textureProjLod(00R20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000079cu, ImmutableString("textureProjLod(00X20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000079du, ImmutableString("textureProjLod(00X20B00B").mangledNameHash());
     ASSERT_EQ(0x00000104u, ImmutableString("textureProjLod(00I30B00B").mangledNameHash());
     ASSERT_EQ(0x00000334u, ImmutableString("textureProjLod(00R30B00B").mangledNameHash());
-    ASSERT_EQ(0x000005a8u, ImmutableString("textureProjLod(00X30B00B").mangledNameHash());
-    ASSERT_EQ(0x000006cdu, ImmutableString("textureProjLod(00J30B00B").mangledNameHash());
+    ASSERT_EQ(0x000005a9u, ImmutableString("textureProjLod(00X30B00B").mangledNameHash());
+    ASSERT_EQ(0x000006ceu, ImmutableString("textureProjLod(00J30B00B").mangledNameHash());
     ASSERT_EQ(0x000003f2u, ImmutableString("textureProjLod(00S30B00B").mangledNameHash());
     ASSERT_EQ(0x000001c0u, ImmutableString("textureProjLod(00Y30B00B").mangledNameHash());
     ASSERT_EQ(0x000002abu, ImmutableString("textureProjLod(00d30B00B").mangledNameHash());
-    ASSERT_EQ(0x0000081eu, ImmutableString("textureProjLod(00g10B00B").mangledNameHash());
+    ASSERT_EQ(0x0000081fu, ImmutableString("textureProjLod(00g10B00B").mangledNameHash());
     ASSERT_EQ(0x0000018bu, ImmutableString("textureProjLod(00o10B00B").mangledNameHash());
     ASSERT_EQ(0x00000516u, ImmutableString("textureProjLod(00t10B00B").mangledNameHash());
     ASSERT_EQ(0x0000050au, ImmutableString("textureProjLod(00g30B00B").mangledNameHash());
-    ASSERT_EQ(0x000006fau, ImmutableString("textureProjLod(00o30B00B").mangledNameHash());
-    ASSERT_EQ(0x000005deu, ImmutableString("textureProjLod(00t30B00B").mangledNameHash());
+    ASSERT_EQ(0x000006fbu, ImmutableString("textureProjLod(00o30B00B").mangledNameHash());
+    ASSERT_EQ(0x000005dfu, ImmutableString("textureProjLod(00t30B00B").mangledNameHash());
     ASSERT_EQ(0x0000040au, ImmutableString("textureProjLod(00m30B00B").mangledNameHash());
     ASSERT_EQ(0x0000004eu, ImmutableString("texelFetch(00I10D00D").mangledNameHash());
     ASSERT_EQ(0x000001dfu, ImmutableString("texelFetch(00R10D00D").mangledNameHash());
     ASSERT_EQ(0x000003bdu, ImmutableString("texelFetch(00X10D00D").mangledNameHash());
     ASSERT_EQ(0x0000021au, ImmutableString("texelFetch(00J20D00D").mangledNameHash());
-    ASSERT_EQ(0x000007b5u, ImmutableString("texelFetch(00S20D00D").mangledNameHash());
+    ASSERT_EQ(0x000007b6u, ImmutableString("texelFetch(00S20D00D").mangledNameHash());
     ASSERT_EQ(0x000000ecu, ImmutableString("texelFetch(00Y20D00D").mangledNameHash());
     ASSERT_EQ(0x0000053cu, ImmutableString("texelFetch(00L20D00D").mangledNameHash());
     ASSERT_EQ(0x000002e8u, ImmutableString("texelFetch(00U20D00D").mangledNameHash());
     ASSERT_EQ(0x0000010cu, ImmutableString("texelFetch(00a20D00D").mangledNameHash());
-    ASSERT_EQ(0x000005f1u, ImmutableString("texelFetch(00g00D00D").mangledNameHash());
+    ASSERT_EQ(0x000005f2u, ImmutableString("texelFetch(00g00D00D").mangledNameHash());
     ASSERT_EQ(0x00000006u, ImmutableString("texelFetch(00o00D00D").mangledNameHash());
     ASSERT_EQ(0x00000325u, ImmutableString("texelFetch(00t00D00D").mangledNameHash());
-    ASSERT_EQ(0x000007a7u, ImmutableString("texelFetch(00O10D").mangledNameHash());
+    ASSERT_EQ(0x000007a8u, ImmutableString("texelFetch(00O10D").mangledNameHash());
     ASSERT_EQ(0x00000336u, ImmutableString("texelFetch(00q10D").mangledNameHash());
     ASSERT_EQ(0x000001efu, ImmutableString("texelFetch(00v10D").mangledNameHash());
-    ASSERT_EQ(0x0000069eu, ImmutableString("texelFetch(00h10D00D").mangledNameHash());
-    ASSERT_EQ(0x000007efu, ImmutableString("texelFetch(00p10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000064au, ImmutableString("texelFetch(00u10D00D").mangledNameHash());
+    ASSERT_EQ(0x0000069fu, ImmutableString("texelFetch(00h10D00D").mangledNameHash());
+    ASSERT_EQ(0x000007f0u, ImmutableString("texelFetch(00p10D00D").mangledNameHash());
+    ASSERT_EQ(0x0000064bu, ImmutableString("texelFetch(00u10D00D").mangledNameHash());
     ASSERT_EQ(0x00000078u, ImmutableString("texelFetch(00j00D").mangledNameHash());
-    ASSERT_EQ(0x000005bfu, ImmutableString("texelFetch(00r00D").mangledNameHash());
+    ASSERT_EQ(0x000005c0u, ImmutableString("texelFetch(00r00D").mangledNameHash());
     ASSERT_EQ(0x0000015au, ImmutableString("texelFetch(00w00D").mangledNameHash());
     ASSERT_EQ(0x00000456u, ImmutableString("textureGrad(00I10B10B10B").mangledNameHash());
     ASSERT_EQ(0x000001e2u, ImmutableString("textureGrad(00R10B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000166u, ImmutableString("textureGrad(00X10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000745u, ImmutableString("textureGrad(00J20B20B20B").mangledNameHash());
-    ASSERT_EQ(0x000006f4u, ImmutableString("textureGrad(00S20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x00000746u, ImmutableString("textureGrad(00J20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x000006f5u, ImmutableString("textureGrad(00S20B20B20B").mangledNameHash());
     ASSERT_EQ(0x000002cbu, ImmutableString("textureGrad(00Y20B20B20B").mangledNameHash());
-    ASSERT_EQ(0x000007b4u, ImmutableString("textureGrad(00K20B20B20B").mangledNameHash());
+    ASSERT_EQ(0x000007b5u, ImmutableString("textureGrad(00K20B20B20B").mangledNameHash());
     ASSERT_EQ(0x000001f7u, ImmutableString("textureGrad(00T20B20B20B").mangledNameHash());
     ASSERT_EQ(0x000000d0u, ImmutableString("textureGrad(00Z20B20B20B").mangledNameHash());
     ASSERT_EQ(0x000002cau, ImmutableString("textureGrad(00I00B00B00B").mangledNameHash());
     ASSERT_EQ(0x00000423u, ImmutableString("textureGrad(00R00B00B00B").mangledNameHash());
     ASSERT_EQ(0x00000070u, ImmutableString("textureGrad(00X00B00B00B").mangledNameHash());
     ASSERT_EQ(0x000004a9u, ImmutableString("textureGrad(00O10B10B10B").mangledNameHash());
-    ASSERT_EQ(0x000005b8u, ImmutableString("textureGrad(00q10B10B10B").mangledNameHash());
+    ASSERT_EQ(0x000005b9u, ImmutableString("textureGrad(00q10B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000073u, ImmutableString("textureGrad(00v10B10B10B").mangledNameHash());
     ASSERT_EQ(0x000002eeu, ImmutableString("textureGrad(00n20B10B10B").mangledNameHash());
-    ASSERT_EQ(0x000006a5u, ImmutableString("textureGrad(00d20B10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000736u, ImmutableString("textureGrad(00e30B20B20B").mangledNameHash());
+    ASSERT_EQ(0x000006a6u, ImmutableString("textureGrad(00d20B10B10B").mangledNameHash());
+    ASSERT_EQ(0x00000737u, ImmutableString("textureGrad(00e30B20B20B").mangledNameHash());
     ASSERT_EQ(0x00000485u, ImmutableString("textureGrad(00L20B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000341u, ImmutableString("textureGrad(00U20B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000317u, ImmutableString("textureGrad(00a20B10B10B").mangledNameHash());
-    ASSERT_EQ(0x00000594u, ImmutableString("textureGrad(00f30B10B10B").mangledNameHash());
-    ASSERT_EQ(0x000006d7u, ImmutableString("textureGrad(00m20B00B00B").mangledNameHash());
-    ASSERT_EQ(0x000005d8u, ImmutableString("textureGrad(00h10B00B00B").mangledNameHash());
-    ASSERT_EQ(0x000007bfu, ImmutableString("textureGrad(00p10B00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000595u, ImmutableString("textureGrad(00f30B10B10B").mangledNameHash());
+    ASSERT_EQ(0x000006d8u, ImmutableString("textureGrad(00m20B00B00B").mangledNameHash());
+    ASSERT_EQ(0x000005d9u, ImmutableString("textureGrad(00h10B00B00B").mangledNameHash());
+    ASSERT_EQ(0x000007c0u, ImmutableString("textureGrad(00p10B00B00B").mangledNameHash());
     ASSERT_EQ(0x00000496u, ImmutableString("textureGrad(00u10B00B00B").mangledNameHash());
     ASSERT_EQ(0x000002f9u, ImmutableString("textureGrad(00i20B00B00B").mangledNameHash());
-    ASSERT_EQ(0x0000057du, ImmutableString("textureGrad(00k30B20B20B").mangledNameHash());
-    ASSERT_EQ(0x000007acu, ImmutableString("textureGrad(00s30B20B20B").mangledNameHash());
-    ASSERT_EQ(0x000006f8u, ImmutableString("textureGrad(00x30B20B20B").mangledNameHash());
+    ASSERT_EQ(0x0000057eu, ImmutableString("textureGrad(00k30B20B20B").mangledNameHash());
+    ASSERT_EQ(0x000007adu, ImmutableString("textureGrad(00s30B20B20B").mangledNameHash());
+    ASSERT_EQ(0x000006f9u, ImmutableString("textureGrad(00x30B20B20B").mangledNameHash());
     ASSERT_EQ(0x000003f9u, ImmutableString("textureProjGrad(00I20B10B10B").mangledNameHash());
     ASSERT_EQ(0x000003f3u, ImmutableString("textureProjGrad(00R20B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000559u, ImmutableString("textureProjGrad(00X20B10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000066du, ImmutableString("textureProjGrad(00I30B10B10B").mangledNameHash());
-    ASSERT_EQ(0x000006eeu, ImmutableString("textureProjGrad(00R30B10B10B").mangledNameHash());
+    ASSERT_EQ(0x0000066eu, ImmutableString("textureProjGrad(00I30B10B10B").mangledNameHash());
+    ASSERT_EQ(0x000006efu, ImmutableString("textureProjGrad(00R30B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000228u, ImmutableString("textureProjGrad(00X30B10B10B").mangledNameHash());
     ASSERT_EQ(0x000000c3u, ImmutableString("textureProjGrad(00J30B20B20B").mangledNameHash());
     ASSERT_EQ(0x00000045u, ImmutableString("textureProjGrad(00S30B20B20B").mangledNameHash());
@@ -900,18 +900,18 @@
     ASSERT_EQ(0x00000322u, ImmutableString("textureProjGrad(00d30B10B10B").mangledNameHash());
     ASSERT_EQ(0x000002d8u, ImmutableString("textureProjGrad(00g10B00B00B").mangledNameHash());
     ASSERT_EQ(0x0000035eu, ImmutableString("textureProjGrad(00o10B00B00B").mangledNameHash());
-    ASSERT_EQ(0x0000063du, ImmutableString("textureProjGrad(00t10B00B00B").mangledNameHash());
-    ASSERT_EQ(0x00000650u, ImmutableString("textureProjGrad(00g30B00B00B").mangledNameHash());
+    ASSERT_EQ(0x0000063eu, ImmutableString("textureProjGrad(00t10B00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000651u, ImmutableString("textureProjGrad(00g30B00B00B").mangledNameHash());
     ASSERT_EQ(0x00000489u, ImmutableString("textureProjGrad(00o30B00B00B").mangledNameHash());
     ASSERT_EQ(0x000000b2u, ImmutableString("textureProjGrad(00t30B00B00B").mangledNameHash());
     ASSERT_EQ(0x000004a4u, ImmutableString("textureProjGrad(00m30B00B00B").mangledNameHash());
-    ASSERT_EQ(0x00000609u, ImmutableString("textureProjGrad(00O20B10B10B").mangledNameHash());
+    ASSERT_EQ(0x0000060au, ImmutableString("textureProjGrad(00O20B10B10B").mangledNameHash());
     ASSERT_EQ(0x00000372u, ImmutableString("textureProjGrad(00q20B10B10B").mangledNameHash());
     ASSERT_EQ(0x000003f1u, ImmutableString("textureProjGrad(00v20B10B10B").mangledNameHash());
-    ASSERT_EQ(0x000007f7u, ImmutableString("textureProjGrad(00O30B10B10B").mangledNameHash());
+    ASSERT_EQ(0x000007f8u, ImmutableString("textureProjGrad(00O30B10B10B").mangledNameHash());
     ASSERT_EQ(0x0000022fu, ImmutableString("textureProjGrad(00q30B10B10B").mangledNameHash());
     ASSERT_EQ(0x0000033au, ImmutableString("textureProjGrad(00v30B10B10B").mangledNameHash());
-    ASSERT_EQ(0x0000073au, ImmutableString("textureProjGrad(00n30B10B10B").mangledNameHash());
+    ASSERT_EQ(0x0000073bu, ImmutableString("textureProjGrad(00n30B10B10B").mangledNameHash());
     ASSERT_EQ(0x000004c9u, ImmutableString("textureQueryLevels(00g").mangledNameHash());
     ASSERT_EQ(0x000004c2u, ImmutableString("textureQueryLevels(00o").mangledNameHash());
     ASSERT_EQ(0x000004cfu, ImmutableString("textureQueryLevels(00t").mangledNameHash());
@@ -945,87 +945,87 @@
     ASSERT_EQ(0x00000433u, ImmutableString("textureSamples(00Q").mangledNameHash());
     ASSERT_EQ(0x0000022eu, ImmutableString("textureSamples(00W").mangledNameHash());
     ASSERT_EQ(0x000003e2u, ImmutableString("textureSamples(00c").mangledNameHash());
-    ASSERT_EQ(0x00000798u, ImmutableString("textureSize(00P").mangledNameHash());
+    ASSERT_EQ(0x00000799u, ImmutableString("textureSize(00P").mangledNameHash());
     ASSERT_EQ(0x00000397u, ImmutableString("textureSize(00V").mangledNameHash());
-    ASSERT_EQ(0x0000078au, ImmutableString("textureSize(00b").mangledNameHash());
-    ASSERT_EQ(0x00000797u, ImmutableString("textureSize(00Q").mangledNameHash());
-    ASSERT_EQ(0x0000079bu, ImmutableString("textureSize(00W").mangledNameHash());
-    ASSERT_EQ(0x00000789u, ImmutableString("textureSize(00c").mangledNameHash());
+    ASSERT_EQ(0x0000078bu, ImmutableString("textureSize(00b").mangledNameHash());
+    ASSERT_EQ(0x00000798u, ImmutableString("textureSize(00Q").mangledNameHash());
+    ASSERT_EQ(0x0000079cu, ImmutableString("textureSize(00W").mangledNameHash());
+    ASSERT_EQ(0x0000078au, ImmutableString("textureSize(00c").mangledNameHash());
     ASSERT_EQ(0x0000048bu, ImmutableString("texelFetch(00P10D00D").mangledNameHash());
     ASSERT_EQ(0x00000503u, ImmutableString("texelFetch(00V10D00D").mangledNameHash());
     ASSERT_EQ(0x0000045bu, ImmutableString("texelFetch(00b10D00D").mangledNameHash());
-    ASSERT_EQ(0x000005e3u, ImmutableString("texelFetch(00Q20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000081du, ImmutableString("texelFetch(00W20D00D").mangledNameHash());
+    ASSERT_EQ(0x000005e4u, ImmutableString("texelFetch(00Q20D00D").mangledNameHash());
+    ASSERT_EQ(0x0000081eu, ImmutableString("texelFetch(00W20D00D").mangledNameHash());
     ASSERT_EQ(0x00000331u, ImmutableString("texelFetch(00c20D00D").mangledNameHash());
     ASSERT_EQ(0x00000077u, ImmutableString("texture(00I10B00B").mangledNameHash());
     ASSERT_EQ(0x00000441u, ImmutableString("texture(00R10B00B").mangledNameHash());
     ASSERT_EQ(0x0000028bu, ImmutableString("texture(00X10B00B").mangledNameHash());
     ASSERT_EQ(0x0000031cu, ImmutableString("texture(00J20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000685u, ImmutableString("texture(00S20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000686u, ImmutableString("texture(00S20B00B").mangledNameHash());
     ASSERT_EQ(0x000000f5u, ImmutableString("texture(00Y20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000743u, ImmutableString("texture(00K20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000744u, ImmutableString("texture(00K20B00B").mangledNameHash());
     ASSERT_EQ(0x000004b2u, ImmutableString("texture(00T20B00B").mangledNameHash());
     ASSERT_EQ(0x000001ebu, ImmutableString("texture(00Z20B00B").mangledNameHash());
     ASSERT_EQ(0x0000012au, ImmutableString("texture(00L20B00B").mangledNameHash());
     ASSERT_EQ(0x00000300u, ImmutableString("texture(00U20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000655u, ImmutableString("texture(00a20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000656u, ImmutableString("texture(00a20B00B").mangledNameHash());
     ASSERT_EQ(0x000003b0u, ImmutableString("textureProj(00I20B00B").mangledNameHash());
-    ASSERT_EQ(0x000005bdu, ImmutableString("textureProj(00R20B00B").mangledNameHash());
+    ASSERT_EQ(0x000005beu, ImmutableString("textureProj(00R20B00B").mangledNameHash());
     ASSERT_EQ(0x0000039eu, ImmutableString("textureProj(00X20B00B").mangledNameHash());
     ASSERT_EQ(0x0000037bu, ImmutableString("textureProj(00I30B00B").mangledNameHash());
     ASSERT_EQ(0x00000000u, ImmutableString("textureProj(00R30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000780u, ImmutableString("textureProj(00X30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000781u, ImmutableString("textureProj(00X30B00B").mangledNameHash());
     ASSERT_EQ(0x0000045cu, ImmutableString("textureProj(00J30B00B").mangledNameHash());
     ASSERT_EQ(0x00000189u, ImmutableString("textureProj(00S30B00B").mangledNameHash());
     ASSERT_EQ(0x00000551u, ImmutableString("textureProj(00Y30B00B").mangledNameHash());
-    ASSERT_EQ(0x0000058du, ImmutableString("texture(00d20B00B").mangledNameHash());
+    ASSERT_EQ(0x0000058eu, ImmutableString("texture(00d20B00B").mangledNameHash());
     ASSERT_EQ(0x0000048fu, ImmutableString("texture(00e30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000652u, ImmutableString("textureProj(00d30B00B").mangledNameHash());
-    ASSERT_EQ(0x0000071bu, ImmutableString("texture(00g00B00B").mangledNameHash());
-    ASSERT_EQ(0x0000084du, ImmutableString("texture(00o00B00B").mangledNameHash());
+    ASSERT_EQ(0x00000653u, ImmutableString("textureProj(00d30B00B").mangledNameHash());
+    ASSERT_EQ(0x0000071cu, ImmutableString("texture(00g00B00B").mangledNameHash());
+    ASSERT_EQ(0x0000084eu, ImmutableString("texture(00o00B00B").mangledNameHash());
     ASSERT_EQ(0x00000110u, ImmutableString("texture(00t00B00B").mangledNameHash());
     ASSERT_EQ(0x000001a0u, ImmutableString("texture(00m20B00B").mangledNameHash());
     ASSERT_EQ(0x0000019eu, ImmutableString("texture(00h20B00B").mangledNameHash());
     ASSERT_EQ(0x00000065u, ImmutableString("texture(00p20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000645u, ImmutableString("texture(00u20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000646u, ImmutableString("texture(00u20B00B").mangledNameHash());
     ASSERT_EQ(0x00000275u, ImmutableString("texture(00i20B00B").mangledNameHash());
-    ASSERT_EQ(0x00000834u, ImmutableString("texture(00f30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000835u, ImmutableString("texture(00f30B00B").mangledNameHash());
     ASSERT_EQ(0x0000005bu, ImmutableString("textureProj(00g10B00B").mangledNameHash());
-    ASSERT_EQ(0x0000062eu, ImmutableString("textureProj(00o10B00B").mangledNameHash());
+    ASSERT_EQ(0x0000062fu, ImmutableString("textureProj(00o10B00B").mangledNameHash());
     ASSERT_EQ(0x000001e4u, ImmutableString("textureProj(00t10B00B").mangledNameHash());
     ASSERT_EQ(0x00000571u, ImmutableString("textureProj(00g30B00B").mangledNameHash());
     ASSERT_EQ(0x000001a2u, ImmutableString("textureProj(00o30B00B").mangledNameHash());
     ASSERT_EQ(0x000004e8u, ImmutableString("textureProj(00t30B00B").mangledNameHash());
-    ASSERT_EQ(0x000007c9u, ImmutableString("textureProj(00m30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000846u, ImmutableString("texture(00M10B00B").mangledNameHash());
-    ASSERT_EQ(0x00000658u, ImmutableString("textureProj(00M20B00B").mangledNameHash());
+    ASSERT_EQ(0x000007cau, ImmutableString("textureProj(00m30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000847u, ImmutableString("texture(00M10B00B").mangledNameHash());
+    ASSERT_EQ(0x00000659u, ImmutableString("textureProj(00M20B00B").mangledNameHash());
     ASSERT_EQ(0x00000452u, ImmutableString("textureProj(00M30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000668u, ImmutableString("texture(00N10B00B").mangledNameHash());
-    ASSERT_EQ(0x000007fbu, ImmutableString("textureProj(00N20B00B").mangledNameHash());
+    ASSERT_EQ(0x00000669u, ImmutableString("texture(00N10B00B").mangledNameHash());
+    ASSERT_EQ(0x000007fcu, ImmutableString("textureProj(00N20B00B").mangledNameHash());
     ASSERT_EQ(0x00000074u, ImmutableString("textureProj(00N30B00B").mangledNameHash());
     ASSERT_EQ(0x000003c4u, ImmutableString("textureQueryLod(00g00B").mangledNameHash());
     ASSERT_EQ(0x00000498u, ImmutableString("textureQueryLod(00o00B").mangledNameHash());
-    ASSERT_EQ(0x0000083cu, ImmutableString("textureQueryLod(00t00B").mangledNameHash());
+    ASSERT_EQ(0x0000083du, ImmutableString("textureQueryLod(00t00B").mangledNameHash());
     ASSERT_EQ(0x00000403u, ImmutableString("textureQueryLod(00I10B").mangledNameHash());
     ASSERT_EQ(0x00000355u, ImmutableString("textureQueryLod(00R10B").mangledNameHash());
-    ASSERT_EQ(0x0000075du, ImmutableString("textureQueryLod(00X10B").mangledNameHash());
-    ASSERT_EQ(0x000005ebu, ImmutableString("textureQueryLod(00J20B").mangledNameHash());
-    ASSERT_EQ(0x00000777u, ImmutableString("textureQueryLod(00S20B").mangledNameHash());
-    ASSERT_EQ(0x000006bfu, ImmutableString("textureQueryLod(00Y20B").mangledNameHash());
+    ASSERT_EQ(0x0000075eu, ImmutableString("textureQueryLod(00X10B").mangledNameHash());
+    ASSERT_EQ(0x000005ecu, ImmutableString("textureQueryLod(00J20B").mangledNameHash());
+    ASSERT_EQ(0x00000778u, ImmutableString("textureQueryLod(00S20B").mangledNameHash());
+    ASSERT_EQ(0x000006c0u, ImmutableString("textureQueryLod(00Y20B").mangledNameHash());
     ASSERT_EQ(0x00000475u, ImmutableString("textureQueryLod(00K20B").mangledNameHash());
     ASSERT_EQ(0x0000014du, ImmutableString("textureQueryLod(00T20B").mangledNameHash());
-    ASSERT_EQ(0x00000738u, ImmutableString("textureQueryLod(00Z20B").mangledNameHash());
-    ASSERT_EQ(0x000005dbu, ImmutableString("textureQueryLod(00h00B").mangledNameHash());
+    ASSERT_EQ(0x00000739u, ImmutableString("textureQueryLod(00Z20B").mangledNameHash());
+    ASSERT_EQ(0x000005dcu, ImmutableString("textureQueryLod(00h00B").mangledNameHash());
     ASSERT_EQ(0x0000009au, ImmutableString("textureQueryLod(00p00B").mangledNameHash());
-    ASSERT_EQ(0x00000688u, ImmutableString("textureQueryLod(00u00B").mangledNameHash());
-    ASSERT_EQ(0x000006d5u, ImmutableString("textureQueryLod(00L10B").mangledNameHash());
-    ASSERT_EQ(0x00000691u, ImmutableString("textureQueryLod(00U10B").mangledNameHash());
+    ASSERT_EQ(0x00000689u, ImmutableString("textureQueryLod(00u00B").mangledNameHash());
+    ASSERT_EQ(0x000006d6u, ImmutableString("textureQueryLod(00L10B").mangledNameHash());
+    ASSERT_EQ(0x00000692u, ImmutableString("textureQueryLod(00U10B").mangledNameHash());
     ASSERT_EQ(0x000000cdu, ImmutableString("textureQueryLod(00a10B").mangledNameHash());
     ASSERT_EQ(0x000001bfu, ImmutableString("textureQueryLod(00k20B").mangledNameHash());
     ASSERT_EQ(0x00000561u, ImmutableString("textureQueryLod(00s20B").mangledNameHash());
     ASSERT_EQ(0x00000567u, ImmutableString("textureQueryLod(00x20B").mangledNameHash());
     ASSERT_EQ(0x0000000bu, ImmutableString("textureQueryLod(00m00B").mangledNameHash());
-    ASSERT_EQ(0x000005f8u, ImmutableString("textureQueryLod(00d10B").mangledNameHash());
+    ASSERT_EQ(0x000005f9u, ImmutableString("textureQueryLod(00d10B").mangledNameHash());
     ASSERT_EQ(0x000002bbu, ImmutableString("textureQueryLod(00e20B").mangledNameHash());
     ASSERT_EQ(0x000000e7u, ImmutableString("textureQueryLod(00i00B").mangledNameHash());
     ASSERT_EQ(0x00000257u, ImmutableString("textureQueryLod(00f10B").mangledNameHash());
@@ -1035,121 +1035,121 @@
     ASSERT_EQ(0x00000172u, ImmutableString("textureOffset(00X10B10D").mangledNameHash());
     ASSERT_EQ(0x00000219u, ImmutableString("textureOffset(00J20B20D").mangledNameHash());
     ASSERT_EQ(0x0000020fu, ImmutableString("textureOffset(00S20B20D").mangledNameHash());
-    ASSERT_EQ(0x000005ccu, ImmutableString("textureOffset(00Y20B20D").mangledNameHash());
-    ASSERT_EQ(0x0000066fu, ImmutableString("textureOffset(00d20B10D").mangledNameHash());
+    ASSERT_EQ(0x000005cdu, ImmutableString("textureOffset(00Y20B20D").mangledNameHash());
+    ASSERT_EQ(0x00000670u, ImmutableString("textureOffset(00d20B10D").mangledNameHash());
     ASSERT_EQ(0x00000082u, ImmutableString("textureOffset(00L20B10D").mangledNameHash());
     ASSERT_EQ(0x00000479u, ImmutableString("textureOffset(00U20B10D").mangledNameHash());
-    ASSERT_EQ(0x00000759u, ImmutableString("textureOffset(00a20B10D").mangledNameHash());
-    ASSERT_EQ(0x000007d7u, ImmutableString("textureOffset(00g00B00D").mangledNameHash());
-    ASSERT_EQ(0x000005dfu, ImmutableString("textureOffset(00o00B00D").mangledNameHash());
+    ASSERT_EQ(0x0000075au, ImmutableString("textureOffset(00a20B10D").mangledNameHash());
+    ASSERT_EQ(0x000007d8u, ImmutableString("textureOffset(00g00B00D").mangledNameHash());
+    ASSERT_EQ(0x000005e0u, ImmutableString("textureOffset(00o00B00D").mangledNameHash());
     ASSERT_EQ(0x0000043fu, ImmutableString("textureOffset(00t00B00D").mangledNameHash());
     ASSERT_EQ(0x000003f8u, ImmutableString("textureOffset(00O10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000718u, ImmutableString("textureOffset(00q10B10D").mangledNameHash());
+    ASSERT_EQ(0x00000719u, ImmutableString("textureOffset(00q10B10D").mangledNameHash());
     ASSERT_EQ(0x000002b7u, ImmutableString("textureOffset(00v10B10D").mangledNameHash());
     ASSERT_EQ(0x000001d2u, ImmutableString("textureOffset(00n20B10D").mangledNameHash());
     ASSERT_EQ(0x0000006cu, ImmutableString("textureOffset(00m20B00D").mangledNameHash());
     ASSERT_EQ(0x00000205u, ImmutableString("textureOffset(00h10B00D").mangledNameHash());
     ASSERT_EQ(0x000000bfu, ImmutableString("textureOffset(00p10B00D").mangledNameHash());
-    ASSERT_EQ(0x00000802u, ImmutableString("textureOffset(00u10B00D").mangledNameHash());
+    ASSERT_EQ(0x00000803u, ImmutableString("textureOffset(00u10B00D").mangledNameHash());
     ASSERT_EQ(0x00000368u, ImmutableString("textureOffset(00i20B00D").mangledNameHash());
-    ASSERT_EQ(0x0000076cu, ImmutableString("textureOffset(00f30B10D").mangledNameHash());
+    ASSERT_EQ(0x0000076du, ImmutableString("textureOffset(00f30B10D").mangledNameHash());
     ASSERT_EQ(0x000004beu, ImmutableString("textureProjOffset(00I20B10D").mangledNameHash());
     ASSERT_EQ(0x00000296u, ImmutableString("textureProjOffset(00R20B10D").mangledNameHash());
-    ASSERT_EQ(0x00000841u, ImmutableString("textureProjOffset(00X20B10D").mangledNameHash());
+    ASSERT_EQ(0x00000842u, ImmutableString("textureProjOffset(00X20B10D").mangledNameHash());
     ASSERT_EQ(0x0000016eu, ImmutableString("textureProjOffset(00I30B10D").mangledNameHash());
-    ASSERT_EQ(0x0000083du, ImmutableString("textureProjOffset(00R30B10D").mangledNameHash());
-    ASSERT_EQ(0x000005ecu, ImmutableString("textureProjOffset(00X30B10D").mangledNameHash());
-    ASSERT_EQ(0x00000638u, ImmutableString("textureProjOffset(00J30B20D").mangledNameHash());
+    ASSERT_EQ(0x0000083eu, ImmutableString("textureProjOffset(00R30B10D").mangledNameHash());
+    ASSERT_EQ(0x000005edu, ImmutableString("textureProjOffset(00X30B10D").mangledNameHash());
+    ASSERT_EQ(0x00000639u, ImmutableString("textureProjOffset(00J30B20D").mangledNameHash());
     ASSERT_EQ(0x00000087u, ImmutableString("textureProjOffset(00S30B20D").mangledNameHash());
     ASSERT_EQ(0x000001d1u, ImmutableString("textureProjOffset(00Y30B20D").mangledNameHash());
     ASSERT_EQ(0x00000412u, ImmutableString("textureProjOffset(00d30B10D").mangledNameHash());
     ASSERT_EQ(0x00000002u, ImmutableString("textureProjOffset(00g10B00D").mangledNameHash());
-    ASSERT_EQ(0x0000057eu, ImmutableString("textureProjOffset(00o10B00D").mangledNameHash());
-    ASSERT_EQ(0x00000734u, ImmutableString("textureProjOffset(00t10B00D").mangledNameHash());
-    ASSERT_EQ(0x00000810u, ImmutableString("textureProjOffset(00g30B00D").mangledNameHash());
+    ASSERT_EQ(0x0000057fu, ImmutableString("textureProjOffset(00o10B00D").mangledNameHash());
+    ASSERT_EQ(0x00000735u, ImmutableString("textureProjOffset(00t10B00D").mangledNameHash());
+    ASSERT_EQ(0x00000811u, ImmutableString("textureProjOffset(00g30B00D").mangledNameHash());
     ASSERT_EQ(0x00000450u, ImmutableString("textureProjOffset(00o30B00D").mangledNameHash());
-    ASSERT_EQ(0x0000071du, ImmutableString("textureProjOffset(00t30B00D").mangledNameHash());
-    ASSERT_EQ(0x000006e3u, ImmutableString("textureProjOffset(00O20B10D").mangledNameHash());
+    ASSERT_EQ(0x0000071eu, ImmutableString("textureProjOffset(00t30B00D").mangledNameHash());
+    ASSERT_EQ(0x000006e4u, ImmutableString("textureProjOffset(00O20B10D").mangledNameHash());
     ASSERT_EQ(0x00000305u, ImmutableString("textureProjOffset(00q20B10D").mangledNameHash());
     ASSERT_EQ(0x0000022au, ImmutableString("textureProjOffset(00v20B10D").mangledNameHash());
     ASSERT_EQ(0x00000135u, ImmutableString("textureProjOffset(00O30B10D").mangledNameHash());
     ASSERT_EQ(0x00000081u, ImmutableString("textureProjOffset(00q30B10D").mangledNameHash());
-    ASSERT_EQ(0x000007c0u, ImmutableString("textureProjOffset(00v30B10D").mangledNameHash());
+    ASSERT_EQ(0x000007c1u, ImmutableString("textureProjOffset(00v30B10D").mangledNameHash());
     ASSERT_EQ(0x000002d0u, ImmutableString("textureProjOffset(00n30B10D").mangledNameHash());
-    ASSERT_EQ(0x00000631u, ImmutableString("textureProjOffset(00m30B00D").mangledNameHash());
+    ASSERT_EQ(0x00000632u, ImmutableString("textureProjOffset(00m30B00D").mangledNameHash());
     ASSERT_EQ(0x00000476u, ImmutableString("textureLodOffset(00I10B00B10D").mangledNameHash());
-    ASSERT_EQ(0x00000646u, ImmutableString("textureLodOffset(00R10B00B10D").mangledNameHash());
+    ASSERT_EQ(0x00000647u, ImmutableString("textureLodOffset(00R10B00B10D").mangledNameHash());
     ASSERT_EQ(0x000004b1u, ImmutableString("textureLodOffset(00X10B00B10D").mangledNameHash());
     ASSERT_EQ(0x00000363u, ImmutableString("textureLodOffset(00J20B00B20D").mangledNameHash());
     ASSERT_EQ(0x00000099u, ImmutableString("textureLodOffset(00S20B00B20D").mangledNameHash());
-    ASSERT_EQ(0x00000724u, ImmutableString("textureLodOffset(00Y20B00B20D").mangledNameHash());
+    ASSERT_EQ(0x00000725u, ImmutableString("textureLodOffset(00Y20B00B20D").mangledNameHash());
     ASSERT_EQ(0x00000557u, ImmutableString("textureLodOffset(00d20B00B10D").mangledNameHash());
-    ASSERT_EQ(0x00000825u, ImmutableString("textureLodOffset(00L20B00B10D").mangledNameHash());
+    ASSERT_EQ(0x00000826u, ImmutableString("textureLodOffset(00L20B00B10D").mangledNameHash());
     ASSERT_EQ(0x0000041cu, ImmutableString("textureLodOffset(00U20B00B10D").mangledNameHash());
     ASSERT_EQ(0x0000002au, ImmutableString("textureLodOffset(00a20B00B10D").mangledNameHash());
     ASSERT_EQ(0x00000184u, ImmutableString("textureLodOffset(00g00B00B00D").mangledNameHash());
     ASSERT_EQ(0x0000001du, ImmutableString("textureLodOffset(00o00B00B00D").mangledNameHash());
     ASSERT_EQ(0x000002e6u, ImmutableString("textureLodOffset(00t00B00B00D").mangledNameHash());
-    ASSERT_EQ(0x000007edu, ImmutableString("textureLodOffset(00m20B00B00D").mangledNameHash());
+    ASSERT_EQ(0x000007eeu, ImmutableString("textureLodOffset(00m20B00B00D").mangledNameHash());
     ASSERT_EQ(0x00000286u, ImmutableString("textureLodOffset(00h10B00B00D").mangledNameHash());
     ASSERT_EQ(0x00000269u, ImmutableString("textureLodOffset(00p10B00B00D").mangledNameHash());
-    ASSERT_EQ(0x00000826u, ImmutableString("textureLodOffset(00u10B00B00D").mangledNameHash());
+    ASSERT_EQ(0x00000827u, ImmutableString("textureLodOffset(00u10B00B00D").mangledNameHash());
     ASSERT_EQ(0x0000044au, ImmutableString("textureLodOffset(00i20B00B00D").mangledNameHash());
-    ASSERT_EQ(0x00000818u, ImmutableString("textureProjLodOffset(00I20B00B10D").mangledNameHash());
+    ASSERT_EQ(0x00000819u, ImmutableString("textureProjLodOffset(00I20B00B10D").mangledNameHash());
     ASSERT_EQ(0x000000beu, ImmutableString("textureProjLodOffset(00R20B00B10D").mangledNameHash());
     ASSERT_EQ(0x000002fcu, ImmutableString("textureProjLodOffset(00X20B00B10D").mangledNameHash());
-    ASSERT_EQ(0x00000615u, ImmutableString("textureProjLodOffset(00I30B00B10D").mangledNameHash());
-    ASSERT_EQ(0x000005d7u, ImmutableString("textureProjLodOffset(00R30B00B10D").mangledNameHash());
+    ASSERT_EQ(0x00000616u, ImmutableString("textureProjLodOffset(00I30B00B10D").mangledNameHash());
+    ASSERT_EQ(0x000005d8u, ImmutableString("textureProjLodOffset(00R30B00B10D").mangledNameHash());
     ASSERT_EQ(0x00000409u, ImmutableString("textureProjLodOffset(00X30B00B10D").mangledNameHash());
     ASSERT_EQ(0x0000032cu, ImmutableString("textureProjLodOffset(00J30B00B20D").mangledNameHash());
     ASSERT_EQ(0x000000e4u, ImmutableString("textureProjLodOffset(00S30B00B20D").mangledNameHash());
-    ASSERT_EQ(0x0000074bu, ImmutableString("textureProjLodOffset(00Y30B00B20D").mangledNameHash());
-    ASSERT_EQ(0x00000612u, ImmutableString("textureProjLodOffset(00d30B00B10D").mangledNameHash());
+    ASSERT_EQ(0x0000074cu, ImmutableString("textureProjLodOffset(00Y30B00B20D").mangledNameHash());
+    ASSERT_EQ(0x00000613u, ImmutableString("textureProjLodOffset(00d30B00B10D").mangledNameHash());
     ASSERT_EQ(0x00000565u, ImmutableString("textureProjLodOffset(00g10B00B00D").mangledNameHash());
     ASSERT_EQ(0x0000013au, ImmutableString("textureProjLodOffset(00o10B00B00D").mangledNameHash());
-    ASSERT_EQ(0x000006e2u, ImmutableString("textureProjLodOffset(00t10B00B00D").mangledNameHash());
+    ASSERT_EQ(0x000006e3u, ImmutableString("textureProjLodOffset(00t10B00B00D").mangledNameHash());
     ASSERT_EQ(0x00000155u, ImmutableString("textureProjLodOffset(00g30B00B00D").mangledNameHash());
-    ASSERT_EQ(0x000005bcu, ImmutableString("textureProjLodOffset(00o30B00B00D").mangledNameHash());
+    ASSERT_EQ(0x000005bdu, ImmutableString("textureProjLodOffset(00o30B00B00D").mangledNameHash());
     ASSERT_EQ(0x00000071u, ImmutableString("textureProjLodOffset(00t30B00B00D").mangledNameHash());
-    ASSERT_EQ(0x00000830u, ImmutableString("textureProjLodOffset(00m30B00B00D").mangledNameHash());
-    ASSERT_EQ(0x000006d4u, ImmutableString("texelFetchOffset(00I10D00D10D").mangledNameHash());
+    ASSERT_EQ(0x00000831u, ImmutableString("textureProjLodOffset(00m30B00B00D").mangledNameHash());
+    ASSERT_EQ(0x000006d5u, ImmutableString("texelFetchOffset(00I10D00D10D").mangledNameHash());
     ASSERT_EQ(0x000004adu, ImmutableString("texelFetchOffset(00R10D00D10D").mangledNameHash());
     ASSERT_EQ(0x0000019cu, ImmutableString("texelFetchOffset(00X10D00D10D").mangledNameHash());
     ASSERT_EQ(0x00000044u, ImmutableString("texelFetchOffset(00J20D00D20D").mangledNameHash());
     ASSERT_EQ(0x000004fcu, ImmutableString("texelFetchOffset(00S20D00D20D").mangledNameHash());
     ASSERT_EQ(0x0000024eu, ImmutableString("texelFetchOffset(00Y20D00D20D").mangledNameHash());
-    ASSERT_EQ(0x000007b8u, ImmutableString("texelFetchOffset(00L20D00D10D").mangledNameHash());
+    ASSERT_EQ(0x000007b9u, ImmutableString("texelFetchOffset(00L20D00D10D").mangledNameHash());
     ASSERT_EQ(0x0000040cu, ImmutableString("texelFetchOffset(00U20D00D10D").mangledNameHash());
     ASSERT_EQ(0x000000b5u, ImmutableString("texelFetchOffset(00a20D00D10D").mangledNameHash());
-    ASSERT_EQ(0x000007c3u, ImmutableString("texelFetchOffset(00g00D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000007c4u, ImmutableString("texelFetchOffset(00g00D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000022cu, ImmutableString("texelFetchOffset(00o00D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000589u, ImmutableString("texelFetchOffset(00t00D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000005e6u, ImmutableString("texelFetchOffset(00O10D10D").mangledNameHash());
+    ASSERT_EQ(0x0000058au, ImmutableString("texelFetchOffset(00t00D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000005e7u, ImmutableString("texelFetchOffset(00O10D10D").mangledNameHash());
     ASSERT_EQ(0x00000023u, ImmutableString("texelFetchOffset(00q10D10D").mangledNameHash());
-    ASSERT_EQ(0x00000854u, ImmutableString("texelFetchOffset(00v10D10D").mangledNameHash());
+    ASSERT_EQ(0x00000855u, ImmutableString("texelFetchOffset(00v10D10D").mangledNameHash());
     ASSERT_EQ(0x000001bau, ImmutableString("texelFetchOffset(00h10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000121u, ImmutableString("texelFetchOffset(00p10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000065du, ImmutableString("texelFetchOffset(00u10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000065eu, ImmutableString("texelFetchOffset(00u10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000362u, ImmutableString("textureGradOffset(00I10B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x000007b2u, ImmutableString("textureGradOffset(00R10B10B10B10D").mangledNameHash());
+    ASSERT_EQ(0x000007b3u, ImmutableString("textureGradOffset(00R10B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x0000019bu, ImmutableString("textureGradOffset(00X10B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x0000026du, ImmutableString("textureGradOffset(00J20B20B20B20D").mangledNameHash());
-    ASSERT_EQ(0x000006c2u, ImmutableString("textureGradOffset(00S20B20B20B20D").mangledNameHash());
-    ASSERT_EQ(0x00000592u, ImmutableString("textureGradOffset(00Y20B20B20B20D").mangledNameHash());
+    ASSERT_EQ(0x000006c3u, ImmutableString("textureGradOffset(00S20B20B20B20D").mangledNameHash());
+    ASSERT_EQ(0x00000593u, ImmutableString("textureGradOffset(00Y20B20B20B20D").mangledNameHash());
     ASSERT_EQ(0x00000410u, ImmutableString("textureGradOffset(00d20B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x000003e9u, ImmutableString("textureGradOffset(00L20B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x000003e5u, ImmutableString("textureGradOffset(00U20B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x00000307u, ImmutableString("textureGradOffset(00a20B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000581u, ImmutableString("textureGradOffset(00f30B10B10B10D").mangledNameHash());
+    ASSERT_EQ(0x00000582u, ImmutableString("textureGradOffset(00f30B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x000002a3u, ImmutableString("textureGradOffset(00g00B00B00B00D").mangledNameHash());
-    ASSERT_EQ(0x00000761u, ImmutableString("textureGradOffset(00o00B00B00B00D").mangledNameHash());
-    ASSERT_EQ(0x00000585u, ImmutableString("textureGradOffset(00t00B00B00B00D").mangledNameHash());
+    ASSERT_EQ(0x00000762u, ImmutableString("textureGradOffset(00o00B00B00B00D").mangledNameHash());
+    ASSERT_EQ(0x00000586u, ImmutableString("textureGradOffset(00t00B00B00B00D").mangledNameHash());
     ASSERT_EQ(0x000003e7u, ImmutableString("textureGradOffset(00O10B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x0000053fu, ImmutableString("textureGradOffset(00q10B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x000002edu, ImmutableString("textureGradOffset(00v10B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x000004eeu, ImmutableString("textureGradOffset(00n20B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x00000349u, ImmutableString("textureGradOffset(00m20B00B00B00D").mangledNameHash());
-    ASSERT_EQ(0x000006ddu, ImmutableString("textureGradOffset(00h10B00B00B00D").mangledNameHash());
+    ASSERT_EQ(0x000006deu, ImmutableString("textureGradOffset(00h10B00B00B00D").mangledNameHash());
     ASSERT_EQ(0x00000154u, ImmutableString("textureGradOffset(00p10B00B00B00D").mangledNameHash());
     ASSERT_EQ(0x000004cdu, ImmutableString("textureGradOffset(00u10B00B00B00D").mangledNameHash());
     ASSERT_EQ(0x00000434u, ImmutableString("textureGradOffset(00i20B00B00B00D").mangledNameHash());
@@ -1159,13 +1159,13 @@
               ImmutableString("textureProjGradOffset(00R20B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x0000038au,
               ImmutableString("textureProjGradOffset(00X20B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x000005a9u,
+    ASSERT_EQ(0x000005aau,
               ImmutableString("textureProjGradOffset(00I30B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x000007b7u,
+    ASSERT_EQ(0x000007b8u,
               ImmutableString("textureProjGradOffset(00R30B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x000006f1u,
+    ASSERT_EQ(0x000006f2u,
               ImmutableString("textureProjGradOffset(00X30B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000852u,
+    ASSERT_EQ(0x00000853u,
               ImmutableString("textureProjGradOffset(00J30B20B20B20D").mangledNameHash());
     ASSERT_EQ(0x000004f3u,
               ImmutableString("textureProjGradOffset(00S30B20B20B20D").mangledNameHash());
@@ -1173,17 +1173,17 @@
               ImmutableString("textureProjGradOffset(00Y30B20B20B20D").mangledNameHash());
     ASSERT_EQ(0x0000016cu,
               ImmutableString("textureProjGradOffset(00d30B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000831u,
+    ASSERT_EQ(0x00000832u,
               ImmutableString("textureProjGradOffset(00g10B00B00B00D").mangledNameHash());
     ASSERT_EQ(0x000002c7u,
               ImmutableString("textureProjGradOffset(00o10B00B00B00D").mangledNameHash());
-    ASSERT_EQ(0x00000773u,
+    ASSERT_EQ(0x00000774u,
               ImmutableString("textureProjGradOffset(00t10B00B00B00D").mangledNameHash());
     ASSERT_EQ(0x000001a1u,
               ImmutableString("textureProjGradOffset(00g30B00B00B00D").mangledNameHash());
     ASSERT_EQ(0x00000570u,
               ImmutableString("textureProjGradOffset(00o30B00B00B00D").mangledNameHash());
-    ASSERT_EQ(0x00000674u,
+    ASSERT_EQ(0x00000675u,
               ImmutableString("textureProjGradOffset(00t30B00B00B00D").mangledNameHash());
     ASSERT_EQ(0x0000034fu,
               ImmutableString("textureProjGradOffset(00O20B10B10B10D").mangledNameHash());
@@ -1197,115 +1197,115 @@
               ImmutableString("textureProjGradOffset(00q30B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x00000005u,
               ImmutableString("textureProjGradOffset(00v30B10B10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000744u,
+    ASSERT_EQ(0x00000745u,
               ImmutableString("textureProjGradOffset(00n30B10B10B10D").mangledNameHash());
     ASSERT_EQ(0x0000056du,
               ImmutableString("textureProjGradOffset(00m30B00B00B00D").mangledNameHash());
-    ASSERT_EQ(0x000007d0u, ImmutableString("textureOffset(00I10B10D00B").mangledNameHash());
+    ASSERT_EQ(0x000007d1u, ImmutableString("textureOffset(00I10B10D00B").mangledNameHash());
     ASSERT_EQ(0x00000147u, ImmutableString("textureOffset(00R10B10D00B").mangledNameHash());
     ASSERT_EQ(0x000000f8u, ImmutableString("textureOffset(00X10B10D00B").mangledNameHash());
-    ASSERT_EQ(0x000007d4u, ImmutableString("textureOffset(00J20B20D00B").mangledNameHash());
-    ASSERT_EQ(0x000005acu, ImmutableString("textureOffset(00S20B20D00B").mangledNameHash());
-    ASSERT_EQ(0x000006c1u, ImmutableString("textureOffset(00Y20B20D00B").mangledNameHash());
+    ASSERT_EQ(0x000007d5u, ImmutableString("textureOffset(00J20B20D00B").mangledNameHash());
+    ASSERT_EQ(0x000005adu, ImmutableString("textureOffset(00S20B20D00B").mangledNameHash());
+    ASSERT_EQ(0x000006c2u, ImmutableString("textureOffset(00Y20B20D00B").mangledNameHash());
     ASSERT_EQ(0x0000006bu, ImmutableString("textureOffset(00d20B10D00B").mangledNameHash());
-    ASSERT_EQ(0x000006cau, ImmutableString("textureOffset(00L20B10D00B").mangledNameHash());
-    ASSERT_EQ(0x00000747u, ImmutableString("textureOffset(00U20B10D00B").mangledNameHash());
+    ASSERT_EQ(0x000006cbu, ImmutableString("textureOffset(00L20B10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000748u, ImmutableString("textureOffset(00U20B10D00B").mangledNameHash());
     ASSERT_EQ(0x00000145u, ImmutableString("textureOffset(00a20B10D00B").mangledNameHash());
     ASSERT_EQ(0x0000037du, ImmutableString("textureOffset(00g00B00D00B").mangledNameHash());
     ASSERT_EQ(0x000002cdu, ImmutableString("textureOffset(00o00B00D00B").mangledNameHash());
-    ASSERT_EQ(0x000005b1u, ImmutableString("textureOffset(00t00B00D00B").mangledNameHash());
-    ASSERT_EQ(0x0000076au, ImmutableString("textureOffset(00m20B00D00B").mangledNameHash());
+    ASSERT_EQ(0x000005b2u, ImmutableString("textureOffset(00t00B00D00B").mangledNameHash());
+    ASSERT_EQ(0x0000076bu, ImmutableString("textureOffset(00m20B00D00B").mangledNameHash());
     ASSERT_EQ(0x000002dcu, ImmutableString("textureOffset(00h10B00D00B").mangledNameHash());
-    ASSERT_EQ(0x00000730u, ImmutableString("textureOffset(00p10B00D00B").mangledNameHash());
+    ASSERT_EQ(0x00000731u, ImmutableString("textureOffset(00p10B00D00B").mangledNameHash());
     ASSERT_EQ(0x00000161u, ImmutableString("textureOffset(00u10B00D00B").mangledNameHash());
-    ASSERT_EQ(0x000005b2u, ImmutableString("textureOffset(00i20B00D00B").mangledNameHash());
-    ASSERT_EQ(0x0000060du, ImmutableString("textureProjOffset(00I20B10D00B").mangledNameHash());
-    ASSERT_EQ(0x000005aeu, ImmutableString("textureProjOffset(00R20B10D00B").mangledNameHash());
-    ASSERT_EQ(0x000006f0u, ImmutableString("textureProjOffset(00X20B10D00B").mangledNameHash());
-    ASSERT_EQ(0x00000821u, ImmutableString("textureProjOffset(00I30B10D00B").mangledNameHash());
+    ASSERT_EQ(0x000005b3u, ImmutableString("textureOffset(00i20B00D00B").mangledNameHash());
+    ASSERT_EQ(0x0000060eu, ImmutableString("textureProjOffset(00I20B10D00B").mangledNameHash());
+    ASSERT_EQ(0x000005afu, ImmutableString("textureProjOffset(00R20B10D00B").mangledNameHash());
+    ASSERT_EQ(0x000006f1u, ImmutableString("textureProjOffset(00X20B10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000822u, ImmutableString("textureProjOffset(00I30B10D00B").mangledNameHash());
     ASSERT_EQ(0x0000042du, ImmutableString("textureProjOffset(00R30B10D00B").mangledNameHash());
-    ASSERT_EQ(0x0000065au, ImmutableString("textureProjOffset(00X30B10D00B").mangledNameHash());
+    ASSERT_EQ(0x0000065bu, ImmutableString("textureProjOffset(00X30B10D00B").mangledNameHash());
     ASSERT_EQ(0x00000158u, ImmutableString("textureProjOffset(00J30B20D00B").mangledNameHash());
-    ASSERT_EQ(0x00000706u, ImmutableString("textureProjOffset(00S30B20D00B").mangledNameHash());
+    ASSERT_EQ(0x00000707u, ImmutableString("textureProjOffset(00S30B20D00B").mangledNameHash());
     ASSERT_EQ(0x00000055u, ImmutableString("textureProjOffset(00Y30B20D00B").mangledNameHash());
     ASSERT_EQ(0x000001f9u, ImmutableString("textureProjOffset(00d30B10D00B").mangledNameHash());
-    ASSERT_EQ(0x000005c3u, ImmutableString("textureProjOffset(00g10B00D00B").mangledNameHash());
+    ASSERT_EQ(0x000005c4u, ImmutableString("textureProjOffset(00g10B00D00B").mangledNameHash());
     ASSERT_EQ(0x00000542u, ImmutableString("textureProjOffset(00o10B00D00B").mangledNameHash());
     ASSERT_EQ(0x000001b2u, ImmutableString("textureProjOffset(00t10B00D00B").mangledNameHash());
     ASSERT_EQ(0x0000040bu, ImmutableString("textureProjOffset(00g30B00D00B").mangledNameHash());
-    ASSERT_EQ(0x00000620u, ImmutableString("textureProjOffset(00o30B00D00B").mangledNameHash());
+    ASSERT_EQ(0x00000621u, ImmutableString("textureProjOffset(00o30B00D00B").mangledNameHash());
     ASSERT_EQ(0x00000035u, ImmutableString("textureProjOffset(00t30B00D00B").mangledNameHash());
     ASSERT_EQ(0x00000339u, ImmutableString("textureProjOffset(00m30B00D00B").mangledNameHash());
     ASSERT_EQ(0x00000284u, ImmutableString("texture(00M10B").mangledNameHash());
     ASSERT_EQ(0x000002d3u, ImmutableString("textureProj(00M20B").mangledNameHash());
     ASSERT_EQ(0x000003e8u, ImmutableString("textureProj(00M30B").mangledNameHash());
     ASSERT_EQ(0x000003e1u, ImmutableString("textureSize(00M00D").mangledNameHash());
-    ASSERT_EQ(0x000006beu, ImmutableString("texelFetch(00M10D00D").mangledNameHash());
+    ASSERT_EQ(0x000006bfu, ImmutableString("texelFetch(00M10D00D").mangledNameHash());
     ASSERT_EQ(0x000000b1u, ImmutableString("texture(00N10B").mangledNameHash());
     ASSERT_EQ(0x00000402u, ImmutableString("textureProj(00N20B").mangledNameHash());
     ASSERT_EQ(0x0000036bu, ImmutableString("textureProj(00N30B").mangledNameHash());
-    ASSERT_EQ(0x000006aeu, ImmutableString("rgb_2_yuv(20B00H").mangledNameHash());
+    ASSERT_EQ(0x000006afu, ImmutableString("rgb_2_yuv(20B00H").mangledNameHash());
     ASSERT_EQ(0x0000045au, ImmutableString("yuv_2_rgb(20B00H").mangledNameHash());
-    ASSERT_EQ(0x00000579u, ImmutableString("textureSize(00N00D").mangledNameHash());
+    ASSERT_EQ(0x0000057au, ImmutableString("textureSize(00N00D").mangledNameHash());
     ASSERT_EQ(0x000001ceu, ImmutableString("texelFetch(00N10D00D").mangledNameHash());
-    ASSERT_EQ(0x000007adu, ImmutableString("textureGather(00I10B").mangledNameHash());
+    ASSERT_EQ(0x000007aeu, ImmutableString("textureGather(00I10B").mangledNameHash());
     ASSERT_EQ(0x0000045du, ImmutableString("textureGather(00R10B").mangledNameHash());
     ASSERT_EQ(0x00000146u, ImmutableString("textureGather(00X10B").mangledNameHash());
     ASSERT_EQ(0x00000501u, ImmutableString("textureGather(00I10B00D").mangledNameHash());
-    ASSERT_EQ(0x000007e6u, ImmutableString("textureGather(00R10B00D").mangledNameHash());
-    ASSERT_EQ(0x00000754u, ImmutableString("textureGather(00X10B00D").mangledNameHash());
+    ASSERT_EQ(0x000007e7u, ImmutableString("textureGather(00R10B00D").mangledNameHash());
+    ASSERT_EQ(0x00000755u, ImmutableString("textureGather(00X10B00D").mangledNameHash());
     ASSERT_EQ(0x000000e5u, ImmutableString("textureGather(00L20B").mangledNameHash());
-    ASSERT_EQ(0x000005e1u, ImmutableString("textureGather(00U20B").mangledNameHash());
+    ASSERT_EQ(0x000005e2u, ImmutableString("textureGather(00U20B").mangledNameHash());
     ASSERT_EQ(0x0000034eu, ImmutableString("textureGather(00a20B").mangledNameHash());
     ASSERT_EQ(0x000000a9u, ImmutableString("textureGather(00L20B00D").mangledNameHash());
     ASSERT_EQ(0x0000042eu, ImmutableString("textureGather(00U20B00D").mangledNameHash());
-    ASSERT_EQ(0x00000662u, ImmutableString("textureGather(00a20B00D").mangledNameHash());
-    ASSERT_EQ(0x00000819u, ImmutableString("textureGather(00K20B").mangledNameHash());
-    ASSERT_EQ(0x00000851u, ImmutableString("textureGather(00T20B").mangledNameHash());
-    ASSERT_EQ(0x000007beu, ImmutableString("textureGather(00Z20B").mangledNameHash());
+    ASSERT_EQ(0x00000663u, ImmutableString("textureGather(00a20B00D").mangledNameHash());
+    ASSERT_EQ(0x0000081au, ImmutableString("textureGather(00K20B").mangledNameHash());
+    ASSERT_EQ(0x00000852u, ImmutableString("textureGather(00T20B").mangledNameHash());
+    ASSERT_EQ(0x000007bfu, ImmutableString("textureGather(00Z20B").mangledNameHash());
     ASSERT_EQ(0x000003ffu, ImmutableString("textureGather(00K20B00D").mangledNameHash());
     ASSERT_EQ(0x00000401u, ImmutableString("textureGather(00T20B00D").mangledNameHash());
     ASSERT_EQ(0x000003d7u, ImmutableString("textureGather(00Z20B00D").mangledNameHash());
-    ASSERT_EQ(0x0000061du, ImmutableString("textureGather(00k30B").mangledNameHash());
+    ASSERT_EQ(0x0000061eu, ImmutableString("textureGather(00k30B").mangledNameHash());
     ASSERT_EQ(0x0000052eu, ImmutableString("textureGather(00s30B").mangledNameHash());
     ASSERT_EQ(0x000003d4u, ImmutableString("textureGather(00x30B").mangledNameHash());
-    ASSERT_EQ(0x00000701u, ImmutableString("textureGather(00k30B00D").mangledNameHash());
+    ASSERT_EQ(0x00000702u, ImmutableString("textureGather(00k30B00D").mangledNameHash());
     ASSERT_EQ(0x00000266u, ImmutableString("textureGather(00s30B00D").mangledNameHash());
     ASSERT_EQ(0x0000013bu, ImmutableString("textureGather(00x30B00D").mangledNameHash());
     ASSERT_EQ(0x00000054u, ImmutableString("textureGather(00O20B").mangledNameHash());
     ASSERT_EQ(0x000002a4u, ImmutableString("textureGather(00q20B").mangledNameHash());
     ASSERT_EQ(0x00000471u, ImmutableString("textureGather(00v20B").mangledNameHash());
-    ASSERT_EQ(0x0000072bu, ImmutableString("textureGather(00O20B00D").mangledNameHash());
-    ASSERT_EQ(0x0000063eu, ImmutableString("textureGather(00q20B00D").mangledNameHash());
+    ASSERT_EQ(0x0000072cu, ImmutableString("textureGather(00O20B00D").mangledNameHash());
+    ASSERT_EQ(0x0000063fu, ImmutableString("textureGather(00q20B00D").mangledNameHash());
     ASSERT_EQ(0x000000ddu, ImmutableString("textureGather(00v20B00D").mangledNameHash());
-    ASSERT_EQ(0x0000072eu, ImmutableString("textureGather(00d10B").mangledNameHash());
-    ASSERT_EQ(0x000007f0u, ImmutableString("textureGather(00d10B00B").mangledNameHash());
-    ASSERT_EQ(0x0000064du, ImmutableString("textureGather(00f20B").mangledNameHash());
+    ASSERT_EQ(0x0000072fu, ImmutableString("textureGather(00d10B").mangledNameHash());
+    ASSERT_EQ(0x000007f1u, ImmutableString("textureGather(00d10B00B").mangledNameHash());
+    ASSERT_EQ(0x0000064eu, ImmutableString("textureGather(00f20B").mangledNameHash());
     ASSERT_EQ(0x00000101u, ImmutableString("textureGather(00f20B00B").mangledNameHash());
     ASSERT_EQ(0x000003fau, ImmutableString("textureGather(00e20B").mangledNameHash());
     ASSERT_EQ(0x000000ceu, ImmutableString("textureGather(00e20B00B").mangledNameHash());
-    ASSERT_EQ(0x0000070du, ImmutableString("textureGather(00l30B00B").mangledNameHash());
-    ASSERT_EQ(0x00000753u, ImmutableString("textureGather(00n10B00B").mangledNameHash());
+    ASSERT_EQ(0x0000070eu, ImmutableString("textureGather(00l30B00B").mangledNameHash());
+    ASSERT_EQ(0x00000754u, ImmutableString("textureGather(00n10B00B").mangledNameHash());
     ASSERT_EQ(0x00000080u, ImmutableString("textureGatherOffset(00I10B10D").mangledNameHash());
-    ASSERT_EQ(0x0000081au, ImmutableString("textureGatherOffset(00R10B10D").mangledNameHash());
+    ASSERT_EQ(0x0000081bu, ImmutableString("textureGatherOffset(00R10B10D").mangledNameHash());
     ASSERT_EQ(0x000003cau, ImmutableString("textureGatherOffset(00X10B10D").mangledNameHash());
     ASSERT_EQ(0x00000555u, ImmutableString("textureGatherOffset(00I10B10D00D").mangledNameHash());
     ASSERT_EQ(0x0000011cu, ImmutableString("textureGatherOffset(00R10B10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000082bu, ImmutableString("textureGatherOffset(00X10B10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000703u, ImmutableString("textureGatherOffset(00L20B10D").mangledNameHash());
+    ASSERT_EQ(0x0000082cu, ImmutableString("textureGatherOffset(00X10B10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000704u, ImmutableString("textureGatherOffset(00L20B10D").mangledNameHash());
     ASSERT_EQ(0x000003a2u, ImmutableString("textureGatherOffset(00U20B10D").mangledNameHash());
-    ASSERT_EQ(0x00000593u, ImmutableString("textureGatherOffset(00a20B10D").mangledNameHash());
+    ASSERT_EQ(0x00000594u, ImmutableString("textureGatherOffset(00a20B10D").mangledNameHash());
     ASSERT_EQ(0x00000247u, ImmutableString("textureGatherOffset(00L20B10D00D").mangledNameHash());
     ASSERT_EQ(0x000004ffu, ImmutableString("textureGatherOffset(00U20B10D00D").mangledNameHash());
     ASSERT_EQ(0x0000007fu, ImmutableString("textureGatherOffset(00a20B10D00D").mangledNameHash());
     ASSERT_EQ(0x00000148u, ImmutableString("textureGatherOffset(00d10B00B10D").mangledNameHash());
     ASSERT_EQ(0x0000030fu, ImmutableString("textureGatherOffset(00f20B00B10D").mangledNameHash());
     ASSERT_EQ(0x00000230u, ImmutableString("textureGatherOffset(00O10B10D").mangledNameHash());
-    ASSERT_EQ(0x00000661u, ImmutableString("textureGatherOffset(00q10B10D").mangledNameHash());
+    ASSERT_EQ(0x00000662u, ImmutableString("textureGatherOffset(00q10B10D").mangledNameHash());
     ASSERT_EQ(0x000004f7u, ImmutableString("textureGatherOffset(00v10B10D").mangledNameHash());
     ASSERT_EQ(0x00000474u, ImmutableString("textureGatherOffset(00O10B10D00D").mangledNameHash());
     ASSERT_EQ(0x00000500u, ImmutableString("textureGatherOffset(00q10B10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000838u, ImmutableString("textureGatherOffset(00v10B10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000839u, ImmutableString("textureGatherOffset(00v10B10D00D").mangledNameHash());
     ASSERT_EQ(0x000000cbu, ImmutableString("textureGatherOffset(00n10B00B10D").mangledNameHash());
     ASSERT_EQ(0x0000027eu, ImmutableString("textureGatherOffsets(00I10B70D").mangledNameHash());
     ASSERT_EQ(0x00000508u, ImmutableString("textureGatherOffsets(00R10B70D").mangledNameHash());
@@ -1316,32 +1316,32 @@
     ASSERT_EQ(0x00000576u, ImmutableString("textureGatherOffsets(00L20B70D").mangledNameHash());
     ASSERT_EQ(0x00000259u, ImmutableString("textureGatherOffsets(00U20B70D").mangledNameHash());
     ASSERT_EQ(0x000001acu, ImmutableString("textureGatherOffsets(00a20B70D").mangledNameHash());
-    ASSERT_EQ(0x0000064eu, ImmutableString("textureGatherOffsets(00L20B70D00D").mangledNameHash());
-    ASSERT_EQ(0x0000060eu, ImmutableString("textureGatherOffsets(00U20B70D00D").mangledNameHash());
+    ASSERT_EQ(0x0000064fu, ImmutableString("textureGatherOffsets(00L20B70D00D").mangledNameHash());
+    ASSERT_EQ(0x0000060fu, ImmutableString("textureGatherOffsets(00U20B70D00D").mangledNameHash());
     ASSERT_EQ(0x000002ffu, ImmutableString("textureGatherOffsets(00a20B70D00D").mangledNameHash());
-    ASSERT_EQ(0x00000610u, ImmutableString("textureGatherOffsets(00O10B70D").mangledNameHash());
-    ASSERT_EQ(0x00000682u, ImmutableString("textureGatherOffsets(00q10B70D").mangledNameHash());
-    ASSERT_EQ(0x000006f3u, ImmutableString("textureGatherOffsets(00v10B70D").mangledNameHash());
+    ASSERT_EQ(0x00000611u, ImmutableString("textureGatherOffsets(00O10B70D").mangledNameHash());
+    ASSERT_EQ(0x00000683u, ImmutableString("textureGatherOffsets(00q10B70D").mangledNameHash());
+    ASSERT_EQ(0x000006f4u, ImmutableString("textureGatherOffsets(00v10B70D").mangledNameHash());
     ASSERT_EQ(0x00000100u, ImmutableString("textureGatherOffsets(00O10B70D00D").mangledNameHash());
-    ASSERT_EQ(0x00000591u, ImmutableString("textureGatherOffsets(00q10B70D00D").mangledNameHash());
-    ASSERT_EQ(0x00000697u, ImmutableString("textureGatherOffsets(00v10B70D00D").mangledNameHash());
+    ASSERT_EQ(0x00000592u, ImmutableString("textureGatherOffsets(00q10B70D00D").mangledNameHash());
+    ASSERT_EQ(0x00000698u, ImmutableString("textureGatherOffsets(00v10B70D00D").mangledNameHash());
     ASSERT_EQ(0x00000330u, ImmutableString("textureGatherOffsets(00d10B00B70D").mangledNameHash());
     ASSERT_EQ(0x00000053u, ImmutableString("textureGatherOffsets(00f20B00B70D").mangledNameHash());
     ASSERT_EQ(0x000004b3u, ImmutableString("textureGatherOffsets(00n10B00B70D").mangledNameHash());
     ASSERT_EQ(0x0000053du, ImmutableString("dFdxFine(00B").mangledNameHash());
     ASSERT_EQ(0x000004aeu, ImmutableString("dFdxFine(10B").mangledNameHash());
-    ASSERT_EQ(0x0000068cu, ImmutableString("dFdxFine(20B").mangledNameHash());
-    ASSERT_EQ(0x000005e9u, ImmutableString("dFdxFine(30B").mangledNameHash());
+    ASSERT_EQ(0x0000068du, ImmutableString("dFdxFine(20B").mangledNameHash());
+    ASSERT_EQ(0x000005eau, ImmutableString("dFdxFine(30B").mangledNameHash());
     ASSERT_EQ(0x00000369u, ImmutableString("dFdyFine(00B").mangledNameHash());
     ASSERT_EQ(0x00000405u, ImmutableString("dFdyFine(10B").mangledNameHash());
     ASSERT_EQ(0x000004aau, ImmutableString("dFdyFine(20B").mangledNameHash());
     ASSERT_EQ(0x00000560u, ImmutableString("dFdyFine(30B").mangledNameHash());
     ASSERT_EQ(0x0000031au, ImmutableString("dFdxCoarse(00B").mangledNameHash());
     ASSERT_EQ(0x00000384u, ImmutableString("dFdxCoarse(10B").mangledNameHash());
-    ASSERT_EQ(0x000007fdu, ImmutableString("dFdxCoarse(20B").mangledNameHash());
+    ASSERT_EQ(0x000007feu, ImmutableString("dFdxCoarse(20B").mangledNameHash());
     ASSERT_EQ(0x00000283u, ImmutableString("dFdxCoarse(30B").mangledNameHash());
     ASSERT_EQ(0x0000007du, ImmutableString("dFdyCoarse(00B").mangledNameHash());
-    ASSERT_EQ(0x0000082au, ImmutableString("dFdyCoarse(10B").mangledNameHash());
+    ASSERT_EQ(0x0000082bu, ImmutableString("dFdyCoarse(10B").mangledNameHash());
     ASSERT_EQ(0x0000056fu, ImmutableString("dFdyCoarse(20B").mangledNameHash());
     ASSERT_EQ(0x000004bau, ImmutableString("dFdyCoarse(30B").mangledNameHash());
     ASSERT_EQ(0x00000347u, ImmutableString("fwidthFine(00B").mangledNameHash());
@@ -1349,29 +1349,29 @@
     ASSERT_EQ(0x00000497u, ImmutableString("fwidthFine(20B").mangledNameHash());
     ASSERT_EQ(0x000003feu, ImmutableString("fwidthFine(30B").mangledNameHash());
     ASSERT_EQ(0x0000056eu, ImmutableString("fwidthCoarse(00B").mangledNameHash());
-    ASSERT_EQ(0x0000060cu, ImmutableString("fwidthCoarse(10B").mangledNameHash());
+    ASSERT_EQ(0x0000060du, ImmutableString("fwidthCoarse(10B").mangledNameHash());
     ASSERT_EQ(0x00000411u, ImmutableString("fwidthCoarse(20B").mangledNameHash());
     ASSERT_EQ(0x000004bdu, ImmutableString("fwidthCoarse(30B").mangledNameHash());
     ASSERT_EQ(0x00000486u, ImmutableString("interpolateAtCentroid(00B").mangledNameHash());
     ASSERT_EQ(0x000003dfu, ImmutableString("interpolateAtCentroid(10B").mangledNameHash());
-    ASSERT_EQ(0x000005d6u, ImmutableString("interpolateAtCentroid(20B").mangledNameHash());
+    ASSERT_EQ(0x000005d7u, ImmutableString("interpolateAtCentroid(20B").mangledNameHash());
     ASSERT_EQ(0x0000052du, ImmutableString("interpolateAtCentroid(30B").mangledNameHash());
-    ASSERT_EQ(0x000006fcu, ImmutableString("interpolateAtSample(00B00D").mangledNameHash());
+    ASSERT_EQ(0x000006fdu, ImmutableString("interpolateAtSample(00B00D").mangledNameHash());
     ASSERT_EQ(0x0000013cu, ImmutableString("interpolateAtSample(10B00D").mangledNameHash());
     ASSERT_EQ(0x000002afu, ImmutableString("interpolateAtSample(20B00D").mangledNameHash());
     ASSERT_EQ(0x00000282u, ImmutableString("interpolateAtSample(30B00D").mangledNameHash());
     ASSERT_EQ(0x00000097u, ImmutableString("interpolateAtOffset(00B10B").mangledNameHash());
-    ASSERT_EQ(0x000005efu, ImmutableString("interpolateAtOffset(10B10B").mangledNameHash());
+    ASSERT_EQ(0x000005f0u, ImmutableString("interpolateAtOffset(10B10B").mangledNameHash());
     ASSERT_EQ(0x00000529u, ImmutableString("interpolateAtOffset(20B10B").mangledNameHash());
     ASSERT_EQ(0x00000001u, ImmutableString("interpolateAtOffset(30B10B").mangledNameHash());
-    ASSERT_EQ(0x000006d6u, ImmutableString("atomicCounter(00G").mangledNameHash());
-    ASSERT_EQ(0x00000629u, ImmutableString("atomicCounterIncrement(00G").mangledNameHash());
+    ASSERT_EQ(0x000006d7u, ImmutableString("atomicCounter(00G").mangledNameHash());
+    ASSERT_EQ(0x0000062au, ImmutableString("atomicCounterIncrement(00G").mangledNameHash());
     ASSERT_EQ(0x000001d9u, ImmutableString("atomicCounterDecrement(00G").mangledNameHash());
-    ASSERT_EQ(0x000007a1u, ImmutableString("atomicCounterAdd(00G00E").mangledNameHash());
-    ASSERT_EQ(0x00000595u, ImmutableString("atomicCounterSubtract(00G00E").mangledNameHash());
+    ASSERT_EQ(0x000007a2u, ImmutableString("atomicCounterAdd(00G00E").mangledNameHash());
+    ASSERT_EQ(0x00000596u, ImmutableString("atomicCounterSubtract(00G00E").mangledNameHash());
     ASSERT_EQ(0x000004ccu, ImmutableString("atomicCounterMin(00G00E").mangledNameHash());
     ASSERT_EQ(0x00000454u, ImmutableString("atomicCounterMax(00G00E").mangledNameHash());
-    ASSERT_EQ(0x0000079eu, ImmutableString("atomicCounterAnd(00G00E").mangledNameHash());
+    ASSERT_EQ(0x0000079fu, ImmutableString("atomicCounterAnd(00G00E").mangledNameHash());
     ASSERT_EQ(0x00000377u, ImmutableString("atomicCounterOr(00G00E").mangledNameHash());
     ASSERT_EQ(0x00000544u, ImmutableString("atomicCounterXor(00G00E").mangledNameHash());
     ASSERT_EQ(0x00000455u, ImmutableString("atomicCounterExchange(00G00E").mangledNameHash());
@@ -1380,16 +1380,16 @@
     ASSERT_EQ(0x00000032u, ImmutableString("atomicAdd(00D00D").mangledNameHash());
     ASSERT_EQ(0x000002eau, ImmutableString("atomicMin(00E00E").mangledNameHash());
     ASSERT_EQ(0x00000426u, ImmutableString("atomicMin(00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000839u, ImmutableString("atomicMax(00E00E").mangledNameHash());
+    ASSERT_EQ(0x0000083au, ImmutableString("atomicMax(00E00E").mangledNameHash());
     ASSERT_EQ(0x000004a3u, ImmutableString("atomicMax(00D00D").mangledNameHash());
-    ASSERT_EQ(0x000006d2u, ImmutableString("atomicAnd(00E00E").mangledNameHash());
+    ASSERT_EQ(0x000006d3u, ImmutableString("atomicAnd(00E00E").mangledNameHash());
     ASSERT_EQ(0x0000047du, ImmutableString("atomicAnd(00D00D").mangledNameHash());
     ASSERT_EQ(0x0000054cu, ImmutableString("atomicOr(00E00E").mangledNameHash());
     ASSERT_EQ(0x00000394u, ImmutableString("atomicOr(00D00D").mangledNameHash());
     ASSERT_EQ(0x00000182u, ImmutableString("atomicXor(00E00E").mangledNameHash());
     ASSERT_EQ(0x000000ebu, ImmutableString("atomicXor(00D00D").mangledNameHash());
     ASSERT_EQ(0x0000024fu, ImmutableString("atomicExchange(00E00E").mangledNameHash());
-    ASSERT_EQ(0x00000769u, ImmutableString("atomicExchange(00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000076au, ImmutableString("atomicExchange(00D00D").mangledNameHash());
     ASSERT_EQ(0x000002c9u, ImmutableString("atomicCompSwap(00E00E00E").mangledNameHash());
     ASSERT_EQ(0x00000365u, ImmutableString("atomicCompSwap(00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000311u, ImmutableString("imageSize(00y").mangledNameHash());
@@ -1409,15 +1409,15 @@
     ASSERT_EQ(0x000003b2u, ImmutableString("imageSize(01M").mangledNameHash());
     ASSERT_EQ(0x000003bau, ImmutableString("imageSize(01Z").mangledNameHash());
     ASSERT_EQ(0x000003ccu, ImmutableString("imageSize(01a").mangledNameHash());
-    ASSERT_EQ(0x000005f6u, ImmutableString("imageSize(01b").mangledNameHash());
+    ASSERT_EQ(0x000005f7u, ImmutableString("imageSize(01b").mangledNameHash());
     ASSERT_EQ(0x000003cbu, ImmutableString("imageSize(01c").mangledNameHash());
     ASSERT_EQ(0x000003cfu, ImmutableString("imageSize(01d").mangledNameHash());
-    ASSERT_EQ(0x00000602u, ImmutableString("imageSize(01e").mangledNameHash());
+    ASSERT_EQ(0x00000603u, ImmutableString("imageSize(01e").mangledNameHash());
     ASSERT_EQ(0x0000056bu, ImmutableString("imageSize(01N").mangledNameHash());
-    ASSERT_EQ(0x000005b7u, ImmutableString("imageSize(01O").mangledNameHash());
+    ASSERT_EQ(0x000005b8u, ImmutableString("imageSize(01O").mangledNameHash());
     ASSERT_EQ(0x000003c1u, ImmutableString("imageSize(01P").mangledNameHash());
     ASSERT_EQ(0x000003cdu, ImmutableString("imageSize(01f").mangledNameHash());
-    ASSERT_EQ(0x00000600u, ImmutableString("imageSize(01g").mangledNameHash());
+    ASSERT_EQ(0x00000601u, ImmutableString("imageSize(01g").mangledNameHash());
     ASSERT_EQ(0x000003c7u, ImmutableString("imageSize(01h").mangledNameHash());
     ASSERT_EQ(0x000003c2u, ImmutableString("imageSize(01Q").mangledNameHash());
     ASSERT_EQ(0x000003bfu, ImmutableString("imageSize(01R").mangledNameHash());
@@ -1431,94 +1431,94 @@
     ASSERT_EQ(0x00000019u, ImmutableString("imageSamples(01T").mangledNameHash());
     ASSERT_EQ(0x00000018u, ImmutableString("imageSamples(01U").mangledNameHash());
     ASSERT_EQ(0x00000017u, ImmutableString("imageSamples(01V").mangledNameHash());
-    ASSERT_EQ(0x00000618u, ImmutableString("imageAtomicAdd(00y10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000619u, ImmutableString("imageAtomicAdd(00y10D00E").mangledNameHash());
     ASSERT_EQ(0x00000010u, ImmutableString("imageAtomicAdd(00z10D00E").mangledNameHash());
-    ASSERT_EQ(0x0000084cu, ImmutableString("imageAtomicAdd(01A10D00E").mangledNameHash());
+    ASSERT_EQ(0x0000084du, ImmutableString("imageAtomicAdd(01A10D00E").mangledNameHash());
     ASSERT_EQ(0x00000225u, ImmutableString("imageAtomicAdd(01B20D00E").mangledNameHash());
     ASSERT_EQ(0x0000033du, ImmutableString("imageAtomicAdd(01C20D00E").mangledNameHash());
     ASSERT_EQ(0x00000031u, ImmutableString("imageAtomicAdd(01D20D00E").mangledNameHash());
-    ASSERT_EQ(0x000006e9u, ImmutableString("imageAtomicAdd(01H20D00E").mangledNameHash());
+    ASSERT_EQ(0x000006eau, ImmutableString("imageAtomicAdd(01H20D00E").mangledNameHash());
     ASSERT_EQ(0x00000128u, ImmutableString("imageAtomicAdd(01I20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000062bu, ImmutableString("imageAtomicAdd(01J20D00E").mangledNameHash());
-    ASSERT_EQ(0x000006c8u, ImmutableString("imageAtomicAdd(01f00D00E").mangledNameHash());
+    ASSERT_EQ(0x0000062cu, ImmutableString("imageAtomicAdd(01J20D00E").mangledNameHash());
+    ASSERT_EQ(0x000006c9u, ImmutableString("imageAtomicAdd(01f00D00E").mangledNameHash());
     ASSERT_EQ(0x00000388u, ImmutableString("imageAtomicAdd(01g00D00E").mangledNameHash());
     ASSERT_EQ(0x000001feu, ImmutableString("imageAtomicAdd(01h00D00E").mangledNameHash());
     ASSERT_EQ(0x000000c9u, ImmutableString("imageAtomicAdd(01E20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000684u, ImmutableString("imageAtomicAdd(01F20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000685u, ImmutableString("imageAtomicAdd(01F20D00E").mangledNameHash());
     ASSERT_EQ(0x0000039au, ImmutableString("imageAtomicAdd(01G20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000058fu, ImmutableString("imageAtomicAdd(01Z20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000590u, ImmutableString("imageAtomicAdd(01Z20D00E").mangledNameHash());
     ASSERT_EQ(0x000003fdu, ImmutableString("imageAtomicAdd(01a20D00E").mangledNameHash());
-    ASSERT_EQ(0x000006a3u, ImmutableString("imageAtomicAdd(01b20D00E").mangledNameHash());
+    ASSERT_EQ(0x000006a4u, ImmutableString("imageAtomicAdd(01b20D00E").mangledNameHash());
     ASSERT_EQ(0x0000008fu, ImmutableString("imageAtomicAdd(01K00D00E").mangledNameHash());
-    ASSERT_EQ(0x000005eau, ImmutableString("imageAtomicAdd(01L00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000799u, ImmutableString("imageAtomicAdd(01M00D00E").mangledNameHash());
+    ASSERT_EQ(0x000005ebu, ImmutableString("imageAtomicAdd(01L00D00E").mangledNameHash());
+    ASSERT_EQ(0x0000079au, ImmutableString("imageAtomicAdd(01M00D00E").mangledNameHash());
     ASSERT_EQ(0x000003a0u, ImmutableString("imageAtomicAdd(01N10D00E").mangledNameHash());
-    ASSERT_EQ(0x000005d0u, ImmutableString("imageAtomicAdd(01O10D00E").mangledNameHash());
-    ASSERT_EQ(0x00000714u, ImmutableString("imageAtomicAdd(01P10D00E").mangledNameHash());
-    ASSERT_EQ(0x000007e1u, ImmutableString("imageAtomicAdd(01W10D00E").mangledNameHash());
-    ASSERT_EQ(0x0000074fu, ImmutableString("imageAtomicAdd(01X10D00E").mangledNameHash());
+    ASSERT_EQ(0x000005d1u, ImmutableString("imageAtomicAdd(01O10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000715u, ImmutableString("imageAtomicAdd(01P10D00E").mangledNameHash());
+    ASSERT_EQ(0x000007e2u, ImmutableString("imageAtomicAdd(01W10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000750u, ImmutableString("imageAtomicAdd(01X10D00E").mangledNameHash());
     ASSERT_EQ(0x0000017cu, ImmutableString("imageAtomicAdd(01Y10D00E").mangledNameHash());
     ASSERT_EQ(0x00000354u, ImmutableString("imageAtomicAdd(01Q10D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000358u, ImmutableString("imageAtomicAdd(01R10D00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000640u, ImmutableString("imageAtomicAdd(01S10D00D00E").mangledNameHash());
-    ASSERT_EQ(0x0000080cu, ImmutableString("imageAtomicAdd(01T20D00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000630u, ImmutableString("imageAtomicAdd(01U20D00D00E").mangledNameHash());
+    ASSERT_EQ(0x00000641u, ImmutableString("imageAtomicAdd(01S10D00D00E").mangledNameHash());
+    ASSERT_EQ(0x0000080du, ImmutableString("imageAtomicAdd(01T20D00D00E").mangledNameHash());
+    ASSERT_EQ(0x00000631u, ImmutableString("imageAtomicAdd(01U20D00D00E").mangledNameHash());
     ASSERT_EQ(0x000001e6u, ImmutableString("imageAtomicAdd(01V20D00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000619u, ImmutableString("imageAtomicAdd(00y10D00D").mangledNameHash());
+    ASSERT_EQ(0x0000061au, ImmutableString("imageAtomicAdd(00y10D00D").mangledNameHash());
     ASSERT_EQ(0x0000024du, ImmutableString("imageAtomicAdd(00z10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000084bu, ImmutableString("imageAtomicAdd(01A10D00D").mangledNameHash());
+    ASSERT_EQ(0x0000084cu, ImmutableString("imageAtomicAdd(01A10D00D").mangledNameHash());
     ASSERT_EQ(0x00000224u, ImmutableString("imageAtomicAdd(01B20D00D").mangledNameHash());
     ASSERT_EQ(0x000002bdu, ImmutableString("imageAtomicAdd(01C20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000707u, ImmutableString("imageAtomicAdd(01D20D00D").mangledNameHash());
-    ASSERT_EQ(0x000006e8u, ImmutableString("imageAtomicAdd(01H20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000071fu, ImmutableString("imageAtomicAdd(01I20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000062au, ImmutableString("imageAtomicAdd(01J20D00D").mangledNameHash());
-    ASSERT_EQ(0x000006c6u, ImmutableString("imageAtomicAdd(01f00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000708u, ImmutableString("imageAtomicAdd(01D20D00D").mangledNameHash());
+    ASSERT_EQ(0x000006e9u, ImmutableString("imageAtomicAdd(01H20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000720u, ImmutableString("imageAtomicAdd(01I20D00D").mangledNameHash());
+    ASSERT_EQ(0x0000062bu, ImmutableString("imageAtomicAdd(01J20D00D").mangledNameHash());
+    ASSERT_EQ(0x000006c7u, ImmutableString("imageAtomicAdd(01f00D00D").mangledNameHash());
     ASSERT_EQ(0x0000020du, ImmutableString("imageAtomicAdd(01g00D00D").mangledNameHash());
     ASSERT_EQ(0x000001fdu, ImmutableString("imageAtomicAdd(01h00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000723u, ImmutableString("imageAtomicAdd(01E20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000683u, ImmutableString("imageAtomicAdd(01F20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000724u, ImmutableString("imageAtomicAdd(01E20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000684u, ImmutableString("imageAtomicAdd(01F20D00D").mangledNameHash());
     ASSERT_EQ(0x0000039bu, ImmutableString("imageAtomicAdd(01G20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000058eu, ImmutableString("imageAtomicAdd(01Z20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000700u, ImmutableString("imageAtomicAdd(01a20D00D").mangledNameHash());
-    ASSERT_EQ(0x000005d5u, ImmutableString("imageAtomicAdd(01b20D00D").mangledNameHash());
+    ASSERT_EQ(0x0000058fu, ImmutableString("imageAtomicAdd(01Z20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000701u, ImmutableString("imageAtomicAdd(01a20D00D").mangledNameHash());
+    ASSERT_EQ(0x000005d6u, ImmutableString("imageAtomicAdd(01b20D00D").mangledNameHash());
     ASSERT_EQ(0x00000090u, ImmutableString("imageAtomicAdd(01K00D00D").mangledNameHash());
     ASSERT_EQ(0x00000274u, ImmutableString("imageAtomicAdd(01L00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000079au, ImmutableString("imageAtomicAdd(01M00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000079bu, ImmutableString("imageAtomicAdd(01M00D00D").mangledNameHash());
     ASSERT_EQ(0x000003a1u, ImmutableString("imageAtomicAdd(01N10D00D").mangledNameHash());
-    ASSERT_EQ(0x000005cfu, ImmutableString("imageAtomicAdd(01O10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000715u, ImmutableString("imageAtomicAdd(01P10D00D").mangledNameHash());
-    ASSERT_EQ(0x000007e0u, ImmutableString("imageAtomicAdd(01W10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000752u, ImmutableString("imageAtomicAdd(01X10D00D").mangledNameHash());
+    ASSERT_EQ(0x000005d0u, ImmutableString("imageAtomicAdd(01O10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000716u, ImmutableString("imageAtomicAdd(01P10D00D").mangledNameHash());
+    ASSERT_EQ(0x000007e1u, ImmutableString("imageAtomicAdd(01W10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000753u, ImmutableString("imageAtomicAdd(01X10D00D").mangledNameHash());
     ASSERT_EQ(0x0000017bu, ImmutableString("imageAtomicAdd(01Y10D00D").mangledNameHash());
     ASSERT_EQ(0x00000376u, ImmutableString("imageAtomicAdd(01Q10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000357u, ImmutableString("imageAtomicAdd(01R10D00D00D").mangledNameHash());
     ASSERT_EQ(0x000002d6u, ImmutableString("imageAtomicAdd(01S10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000080du, ImmutableString("imageAtomicAdd(01T20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000062fu, ImmutableString("imageAtomicAdd(01U20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000080eu, ImmutableString("imageAtomicAdd(01T20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000630u, ImmutableString("imageAtomicAdd(01U20D00D00D").mangledNameHash());
     ASSERT_EQ(0x000002f6u, ImmutableString("imageAtomicAdd(01V20D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000108u, ImmutableString("imageAtomicMin(00y10D00E").mangledNameHash());
-    ASSERT_EQ(0x000005a1u, ImmutableString("imageAtomicMin(00z10D00E").mangledNameHash());
-    ASSERT_EQ(0x0000057fu, ImmutableString("imageAtomicMin(01A10D00E").mangledNameHash());
-    ASSERT_EQ(0x0000083au, ImmutableString("imageAtomicMin(01B20D00E").mangledNameHash());
+    ASSERT_EQ(0x000005a2u, ImmutableString("imageAtomicMin(00z10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000580u, ImmutableString("imageAtomicMin(01A10D00E").mangledNameHash());
+    ASSERT_EQ(0x0000083bu, ImmutableString("imageAtomicMin(01B20D00E").mangledNameHash());
     ASSERT_EQ(0x000002a9u, ImmutableString("imageAtomicMin(01C20D00E").mangledNameHash());
     ASSERT_EQ(0x0000040eu, ImmutableString("imageAtomicMin(01D20D00E").mangledNameHash());
     ASSERT_EQ(0x00000226u, ImmutableString("imageAtomicMin(01H20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000728u, ImmutableString("imageAtomicMin(01I20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000729u, ImmutableString("imageAtomicMin(01I20D00E").mangledNameHash());
     ASSERT_EQ(0x0000018cu, ImmutableString("imageAtomicMin(01J20D00E").mangledNameHash());
-    ASSERT_EQ(0x000006b7u, ImmutableString("imageAtomicMin(01f00D00E").mangledNameHash());
+    ASSERT_EQ(0x000006b8u, ImmutableString("imageAtomicMin(01f00D00E").mangledNameHash());
     ASSERT_EQ(0x0000037fu, ImmutableString("imageAtomicMin(01g00D00E").mangledNameHash());
     ASSERT_EQ(0x0000011du, ImmutableString("imageAtomicMin(01h00D00E").mangledNameHash());
-    ASSERT_EQ(0x000005c9u, ImmutableString("imageAtomicMin(01E20D00E").mangledNameHash());
+    ASSERT_EQ(0x000005cau, ImmutableString("imageAtomicMin(01E20D00E").mangledNameHash());
     ASSERT_EQ(0x0000013du, ImmutableString("imageAtomicMin(01F20D00E").mangledNameHash());
     ASSERT_EQ(0x0000027du, ImmutableString("imageAtomicMin(01G20D00E").mangledNameHash());
-    ASSERT_EQ(0x000006a1u, ImmutableString("imageAtomicMin(01Z20D00E").mangledNameHash());
-    ASSERT_EQ(0x000006a4u, ImmutableString("imageAtomicMin(01a20D00E").mangledNameHash());
+    ASSERT_EQ(0x000006a2u, ImmutableString("imageAtomicMin(01Z20D00E").mangledNameHash());
+    ASSERT_EQ(0x000006a5u, ImmutableString("imageAtomicMin(01a20D00E").mangledNameHash());
     ASSERT_EQ(0x00000291u, ImmutableString("imageAtomicMin(01b20D00E").mangledNameHash());
-    ASSERT_EQ(0x000007cfu, ImmutableString("imageAtomicMin(01K00D00E").mangledNameHash());
+    ASSERT_EQ(0x000007d0u, ImmutableString("imageAtomicMin(01K00D00E").mangledNameHash());
     ASSERT_EQ(0x00000549u, ImmutableString("imageAtomicMin(01L00D00E").mangledNameHash());
     ASSERT_EQ(0x0000048eu, ImmutableString("imageAtomicMin(01M00D00E").mangledNameHash());
-    ASSERT_EQ(0x000007a9u, ImmutableString("imageAtomicMin(01N10D00E").mangledNameHash());
+    ASSERT_EQ(0x000007aau, ImmutableString("imageAtomicMin(01N10D00E").mangledNameHash());
     ASSERT_EQ(0x00000490u, ImmutableString("imageAtomicMin(01O10D00E").mangledNameHash());
     ASSERT_EQ(0x0000033cu, ImmutableString("imageAtomicMin(01P10D00E").mangledNameHash());
     ASSERT_EQ(0x00000312u, ImmutableString("imageAtomicMin(01W10D00E").mangledNameHash());
@@ -1526,32 +1526,32 @@
     ASSERT_EQ(0x0000010fu, ImmutableString("imageAtomicMin(01Y10D00E").mangledNameHash());
     ASSERT_EQ(0x000002ecu, ImmutableString("imageAtomicMin(01Q10D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000051u, ImmutableString("imageAtomicMin(01R10D00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000705u, ImmutableString("imageAtomicMin(01S10D00D00E").mangledNameHash());
+    ASSERT_EQ(0x00000706u, ImmutableString("imageAtomicMin(01S10D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000153u, ImmutableString("imageAtomicMin(01T20D00D00E").mangledNameHash());
-    ASSERT_EQ(0x0000073bu, ImmutableString("imageAtomicMin(01U20D00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000672u, ImmutableString("imageAtomicMin(01V20D00D00E").mangledNameHash());
+    ASSERT_EQ(0x0000073cu, ImmutableString("imageAtomicMin(01U20D00D00E").mangledNameHash());
+    ASSERT_EQ(0x00000673u, ImmutableString("imageAtomicMin(01V20D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000107u, ImmutableString("imageAtomicMin(00y10D00D").mangledNameHash());
-    ASSERT_EQ(0x000005a2u, ImmutableString("imageAtomicMin(00z10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000580u, ImmutableString("imageAtomicMin(01A10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000083bu, ImmutableString("imageAtomicMin(01B20D00D").mangledNameHash());
+    ASSERT_EQ(0x000005a3u, ImmutableString("imageAtomicMin(00z10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000581u, ImmutableString("imageAtomicMin(01A10D00D").mangledNameHash());
+    ASSERT_EQ(0x0000083cu, ImmutableString("imageAtomicMin(01B20D00D").mangledNameHash());
     ASSERT_EQ(0x000002a8u, ImmutableString("imageAtomicMin(01C20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000768u, ImmutableString("imageAtomicMin(01D20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000769u, ImmutableString("imageAtomicMin(01D20D00D").mangledNameHash());
     ASSERT_EQ(0x0000041fu, ImmutableString("imageAtomicMin(01H20D00D").mangledNameHash());
     ASSERT_EQ(0x000000dcu, ImmutableString("imageAtomicMin(01I20D00D").mangledNameHash());
     ASSERT_EQ(0x000003d2u, ImmutableString("imageAtomicMin(01J20D00D").mangledNameHash());
-    ASSERT_EQ(0x000006b8u, ImmutableString("imageAtomicMin(01f00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000794u, ImmutableString("imageAtomicMin(01g00D00D").mangledNameHash());
+    ASSERT_EQ(0x000006b9u, ImmutableString("imageAtomicMin(01f00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000795u, ImmutableString("imageAtomicMin(01g00D00D").mangledNameHash());
     ASSERT_EQ(0x0000011eu, ImmutableString("imageAtomicMin(01h00D00D").mangledNameHash());
-    ASSERT_EQ(0x000005c8u, ImmutableString("imageAtomicMin(01E20D00D").mangledNameHash());
+    ASSERT_EQ(0x000005c9u, ImmutableString("imageAtomicMin(01E20D00D").mangledNameHash());
     ASSERT_EQ(0x0000013eu, ImmutableString("imageAtomicMin(01F20D00D").mangledNameHash());
     ASSERT_EQ(0x0000027cu, ImmutableString("imageAtomicMin(01G20D00D").mangledNameHash());
-    ASSERT_EQ(0x000006a2u, ImmutableString("imageAtomicMin(01Z20D00D").mangledNameHash());
+    ASSERT_EQ(0x000006a3u, ImmutableString("imageAtomicMin(01Z20D00D").mangledNameHash());
     ASSERT_EQ(0x0000031bu, ImmutableString("imageAtomicMin(01a20D00D").mangledNameHash());
     ASSERT_EQ(0x00000292u, ImmutableString("imageAtomicMin(01b20D00D").mangledNameHash());
-    ASSERT_EQ(0x000007ceu, ImmutableString("imageAtomicMin(01K00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000068du, ImmutableString("imageAtomicMin(01L00D00D").mangledNameHash());
+    ASSERT_EQ(0x000007cfu, ImmutableString("imageAtomicMin(01K00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000068eu, ImmutableString("imageAtomicMin(01L00D00D").mangledNameHash());
     ASSERT_EQ(0x0000048du, ImmutableString("imageAtomicMin(01M00D00D").mangledNameHash());
-    ASSERT_EQ(0x000007a8u, ImmutableString("imageAtomicMin(01N10D00D").mangledNameHash());
+    ASSERT_EQ(0x000007a9u, ImmutableString("imageAtomicMin(01N10D00D").mangledNameHash());
     ASSERT_EQ(0x00000491u, ImmutableString("imageAtomicMin(01O10D00D").mangledNameHash());
     ASSERT_EQ(0x000002b8u, ImmutableString("imageAtomicMin(01P10D00D").mangledNameHash());
     ASSERT_EQ(0x000001a9u, ImmutableString("imageAtomicMin(01W10D00D").mangledNameHash());
@@ -1559,65 +1559,65 @@
     ASSERT_EQ(0x0000003au, ImmutableString("imageAtomicMin(01Y10D00D").mangledNameHash());
     ASSERT_EQ(0x000002ebu, ImmutableString("imageAtomicMin(01Q10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000052u, ImmutableString("imageAtomicMin(01R10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000704u, ImmutableString("imageAtomicMin(01S10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000705u, ImmutableString("imageAtomicMin(01S10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000152u, ImmutableString("imageAtomicMin(01T20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000073cu, ImmutableString("imageAtomicMin(01U20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000671u, ImmutableString("imageAtomicMin(01V20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000073du, ImmutableString("imageAtomicMin(01U20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000672u, ImmutableString("imageAtomicMin(01V20D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000047cu, ImmutableString("imageAtomicMax(00y10D00E").mangledNameHash());
     ASSERT_EQ(0x000003f4u, ImmutableString("imageAtomicMax(00z10D00E").mangledNameHash());
     ASSERT_EQ(0x000000e0u, ImmutableString("imageAtomicMax(01A10D00E").mangledNameHash());
     ASSERT_EQ(0x000004ecu, ImmutableString("imageAtomicMax(01B20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000070cu, ImmutableString("imageAtomicMax(01C20D00E").mangledNameHash());
+    ASSERT_EQ(0x0000070du, ImmutableString("imageAtomicMax(01C20D00E").mangledNameHash());
     ASSERT_EQ(0x000002dau, ImmutableString("imageAtomicMax(01D20D00E").mangledNameHash());
     ASSERT_EQ(0x0000032du, ImmutableString("imageAtomicMax(01H20D00E").mangledNameHash());
     ASSERT_EQ(0x00000553u, ImmutableString("imageAtomicMax(01I20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000766u, ImmutableString("imageAtomicMax(01J20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000643u, ImmutableString("imageAtomicMax(01f00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000607u, ImmutableString("imageAtomicMax(01g00D00E").mangledNameHash());
-    ASSERT_EQ(0x0000074cu, ImmutableString("imageAtomicMax(01h00D00E").mangledNameHash());
+    ASSERT_EQ(0x00000767u, ImmutableString("imageAtomicMax(01J20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000644u, ImmutableString("imageAtomicMax(01f00D00E").mangledNameHash());
+    ASSERT_EQ(0x00000608u, ImmutableString("imageAtomicMax(01g00D00E").mangledNameHash());
+    ASSERT_EQ(0x0000074du, ImmutableString("imageAtomicMax(01h00D00E").mangledNameHash());
     ASSERT_EQ(0x00000408u, ImmutableString("imageAtomicMax(01E20D00E").mangledNameHash());
     ASSERT_EQ(0x0000050eu, ImmutableString("imageAtomicMax(01F20D00E").mangledNameHash());
-    ASSERT_EQ(0x000005fbu, ImmutableString("imageAtomicMax(01G20D00E").mangledNameHash());
+    ASSERT_EQ(0x000005fcu, ImmutableString("imageAtomicMax(01G20D00E").mangledNameHash());
     ASSERT_EQ(0x000003bcu, ImmutableString("imageAtomicMax(01Z20D00E").mangledNameHash());
     ASSERT_EQ(0x00000509u, ImmutableString("imageAtomicMax(01a20D00E").mangledNameHash());
     ASSERT_EQ(0x0000027bu, ImmutableString("imageAtomicMax(01b20D00E").mangledNameHash());
     ASSERT_EQ(0x00000058u, ImmutableString("imageAtomicMax(01K00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000755u, ImmutableString("imageAtomicMax(01L00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000721u, ImmutableString("imageAtomicMax(01M00D00E").mangledNameHash());
-    ASSERT_EQ(0x0000073fu, ImmutableString("imageAtomicMax(01N10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000756u, ImmutableString("imageAtomicMax(01L00D00E").mangledNameHash());
+    ASSERT_EQ(0x00000722u, ImmutableString("imageAtomicMax(01M00D00E").mangledNameHash());
+    ASSERT_EQ(0x00000740u, ImmutableString("imageAtomicMax(01N10D00E").mangledNameHash());
     ASSERT_EQ(0x0000043bu, ImmutableString("imageAtomicMax(01O10D00E").mangledNameHash());
     ASSERT_EQ(0x00000294u, ImmutableString("imageAtomicMax(01P10D00E").mangledNameHash());
-    ASSERT_EQ(0x0000062du, ImmutableString("imageAtomicMax(01W10D00E").mangledNameHash());
+    ASSERT_EQ(0x0000062eu, ImmutableString("imageAtomicMax(01W10D00E").mangledNameHash());
     ASSERT_EQ(0x00000278u, ImmutableString("imageAtomicMax(01X10D00E").mangledNameHash());
     ASSERT_EQ(0x000000a4u, ImmutableString("imageAtomicMax(01Y10D00E").mangledNameHash());
     ASSERT_EQ(0x000000bau, ImmutableString("imageAtomicMax(01Q10D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000138u, ImmutableString("imageAtomicMax(01R10D00D00E").mangledNameHash());
     ASSERT_EQ(0x0000003eu, ImmutableString("imageAtomicMax(01S10D00D00E").mangledNameHash());
-    ASSERT_EQ(0x000006a8u, ImmutableString("imageAtomicMax(01T20D00D00E").mangledNameHash());
+    ASSERT_EQ(0x000006a9u, ImmutableString("imageAtomicMax(01T20D00D00E").mangledNameHash());
     ASSERT_EQ(0x0000014fu, ImmutableString("imageAtomicMax(01U20D00D00E").mangledNameHash());
     ASSERT_EQ(0x000003fbu, ImmutableString("imageAtomicMax(01V20D00D00E").mangledNameHash());
     ASSERT_EQ(0x0000047bu, ImmutableString("imageAtomicMax(00y10D00D").mangledNameHash());
     ASSERT_EQ(0x000003f5u, ImmutableString("imageAtomicMax(00z10D00D").mangledNameHash());
     ASSERT_EQ(0x000000e1u, ImmutableString("imageAtomicMax(01A10D00D").mangledNameHash());
     ASSERT_EQ(0x00000387u, ImmutableString("imageAtomicMax(01B20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000070bu, ImmutableString("imageAtomicMax(01C20D00D").mangledNameHash());
+    ASSERT_EQ(0x0000070cu, ImmutableString("imageAtomicMax(01C20D00D").mangledNameHash());
     ASSERT_EQ(0x000002dbu, ImmutableString("imageAtomicMax(01D20D00D").mangledNameHash());
     ASSERT_EQ(0x0000032eu, ImmutableString("imageAtomicMax(01H20D00D").mangledNameHash());
     ASSERT_EQ(0x00000552u, ImmutableString("imageAtomicMax(01I20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000767u, ImmutableString("imageAtomicMax(01J20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000644u, ImmutableString("imageAtomicMax(01f00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000606u, ImmutableString("imageAtomicMax(01g00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000768u, ImmutableString("imageAtomicMax(01J20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000645u, ImmutableString("imageAtomicMax(01f00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000607u, ImmutableString("imageAtomicMax(01g00D00D").mangledNameHash());
     ASSERT_EQ(0x000002b2u, ImmutableString("imageAtomicMax(01h00D00D").mangledNameHash());
     ASSERT_EQ(0x00000407u, ImmutableString("imageAtomicMax(01E20D00D").mangledNameHash());
     ASSERT_EQ(0x0000050fu, ImmutableString("imageAtomicMax(01F20D00D").mangledNameHash());
-    ASSERT_EQ(0x000005fau, ImmutableString("imageAtomicMax(01G20D00D").mangledNameHash());
-    ASSERT_EQ(0x000007f8u, ImmutableString("imageAtomicMax(01Z20D00D").mangledNameHash());
+    ASSERT_EQ(0x000005fbu, ImmutableString("imageAtomicMax(01G20D00D").mangledNameHash());
+    ASSERT_EQ(0x000007f9u, ImmutableString("imageAtomicMax(01Z20D00D").mangledNameHash());
     ASSERT_EQ(0x00000466u, ImmutableString("imageAtomicMax(01a20D00D").mangledNameHash());
     ASSERT_EQ(0x000001d5u, ImmutableString("imageAtomicMax(01b20D00D").mangledNameHash());
     ASSERT_EQ(0x00000057u, ImmutableString("imageAtomicMax(01K00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000756u, ImmutableString("imageAtomicMax(01L00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000720u, ImmutableString("imageAtomicMax(01M00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000073eu, ImmutableString("imageAtomicMax(01N10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000757u, ImmutableString("imageAtomicMax(01L00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000721u, ImmutableString("imageAtomicMax(01M00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000073fu, ImmutableString("imageAtomicMax(01N10D00D").mangledNameHash());
     ASSERT_EQ(0x0000043cu, ImmutableString("imageAtomicMax(01O10D00D").mangledNameHash());
     ASSERT_EQ(0x00000293u, ImmutableString("imageAtomicMax(01P10D00D").mangledNameHash());
     ASSERT_EQ(0x000002feu, ImmutableString("imageAtomicMax(01W10D00D").mangledNameHash());
@@ -1626,49 +1626,49 @@
     ASSERT_EQ(0x000000b9u, ImmutableString("imageAtomicMax(01Q10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000139u, ImmutableString("imageAtomicMax(01R10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000125u, ImmutableString("imageAtomicMax(01S10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000006a7u, ImmutableString("imageAtomicMax(01T20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000006a8u, ImmutableString("imageAtomicMax(01T20D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000150u, ImmutableString("imageAtomicMax(01U20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000006deu, ImmutableString("imageAtomicMax(01V20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000827u, ImmutableString("imageAtomicAnd(00y10D00E").mangledNameHash());
-    ASSERT_EQ(0x000007d2u, ImmutableString("imageAtomicAnd(00z10D00E").mangledNameHash());
+    ASSERT_EQ(0x000006dfu, ImmutableString("imageAtomicMax(01V20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000828u, ImmutableString("imageAtomicAnd(00y10D00E").mangledNameHash());
+    ASSERT_EQ(0x000007d3u, ImmutableString("imageAtomicAnd(00z10D00E").mangledNameHash());
     ASSERT_EQ(0x000000ffu, ImmutableString("imageAtomicAnd(01A10D00E").mangledNameHash());
-    ASSERT_EQ(0x0000063fu, ImmutableString("imageAtomicAnd(01B20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000640u, ImmutableString("imageAtomicAnd(01B20D00E").mangledNameHash());
     ASSERT_EQ(0x0000006au, ImmutableString("imageAtomicAnd(01C20D00E").mangledNameHash());
-    ASSERT_EQ(0x000006b4u, ImmutableString("imageAtomicAnd(01D20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000077fu, ImmutableString("imageAtomicAnd(01H20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000075eu, ImmutableString("imageAtomicAnd(01I20D00E").mangledNameHash());
+    ASSERT_EQ(0x000006b5u, ImmutableString("imageAtomicAnd(01D20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000780u, ImmutableString("imageAtomicAnd(01H20D00E").mangledNameHash());
+    ASSERT_EQ(0x0000075fu, ImmutableString("imageAtomicAnd(01I20D00E").mangledNameHash());
     ASSERT_EQ(0x00000123u, ImmutableString("imageAtomicAnd(01J20D00E").mangledNameHash());
     ASSERT_EQ(0x00000016u, ImmutableString("imageAtomicAnd(01f00D00E").mangledNameHash());
     ASSERT_EQ(0x000001f3u, ImmutableString("imageAtomicAnd(01g00D00E").mangledNameHash());
     ASSERT_EQ(0x000003a4u, ImmutableString("imageAtomicAnd(01h00D00E").mangledNameHash());
     ASSERT_EQ(0x00000499u, ImmutableString("imageAtomicAnd(01E20D00E").mangledNameHash());
     ASSERT_EQ(0x000002aau, ImmutableString("imageAtomicAnd(01F20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000805u, ImmutableString("imageAtomicAnd(01G20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000806u, ImmutableString("imageAtomicAnd(01G20D00E").mangledNameHash());
     ASSERT_EQ(0x00000175u, ImmutableString("imageAtomicAnd(01Z20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000793u, ImmutableString("imageAtomicAnd(01a20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000794u, ImmutableString("imageAtomicAnd(01a20D00E").mangledNameHash());
     ASSERT_EQ(0x00000094u, ImmutableString("imageAtomicAnd(01b20D00E").mangledNameHash());
     ASSERT_EQ(0x000004afu, ImmutableString("imageAtomicAnd(01K00D00E").mangledNameHash());
     ASSERT_EQ(0x0000025bu, ImmutableString("imageAtomicAnd(01L00D00E").mangledNameHash());
     ASSERT_EQ(0x00000214u, ImmutableString("imageAtomicAnd(01M00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000692u, ImmutableString("imageAtomicAnd(01N10D00E").mangledNameHash());
-    ASSERT_EQ(0x00000751u, ImmutableString("imageAtomicAnd(01O10D00E").mangledNameHash());
-    ASSERT_EQ(0x00000613u, ImmutableString("imageAtomicAnd(01P10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000693u, ImmutableString("imageAtomicAnd(01N10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000752u, ImmutableString("imageAtomicAnd(01O10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000614u, ImmutableString("imageAtomicAnd(01P10D00E").mangledNameHash());
     ASSERT_EQ(0x000004dbu, ImmutableString("imageAtomicAnd(01W10D00E").mangledNameHash());
-    ASSERT_EQ(0x00000699u, ImmutableString("imageAtomicAnd(01X10D00E").mangledNameHash());
-    ASSERT_EQ(0x00000599u, ImmutableString("imageAtomicAnd(01Y10D00E").mangledNameHash());
-    ASSERT_EQ(0x0000061au, ImmutableString("imageAtomicAnd(01Q10D00D00E").mangledNameHash());
+    ASSERT_EQ(0x0000069au, ImmutableString("imageAtomicAnd(01X10D00E").mangledNameHash());
+    ASSERT_EQ(0x0000059au, ImmutableString("imageAtomicAnd(01Y10D00E").mangledNameHash());
+    ASSERT_EQ(0x0000061bu, ImmutableString("imageAtomicAnd(01Q10D00D00E").mangledNameHash());
     ASSERT_EQ(0x000004a5u, ImmutableString("imageAtomicAnd(01R10D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000467u, ImmutableString("imageAtomicAnd(01S10D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000194u, ImmutableString("imageAtomicAnd(01T20D00D00E").mangledNameHash());
     ASSERT_EQ(0x000001c3u, ImmutableString("imageAtomicAnd(01U20D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000062u, ImmutableString("imageAtomicAnd(01V20D00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000828u, ImmutableString("imageAtomicAnd(00y10D00D").mangledNameHash());
-    ASSERT_EQ(0x000007d1u, ImmutableString("imageAtomicAnd(00z10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000829u, ImmutableString("imageAtomicAnd(00y10D00D").mangledNameHash());
+    ASSERT_EQ(0x000007d2u, ImmutableString("imageAtomicAnd(00z10D00D").mangledNameHash());
     ASSERT_EQ(0x00000030u, ImmutableString("imageAtomicAnd(01A10D00D").mangledNameHash());
-    ASSERT_EQ(0x000005c0u, ImmutableString("imageAtomicAnd(01B20D00D").mangledNameHash());
+    ASSERT_EQ(0x000005c1u, ImmutableString("imageAtomicAnd(01B20D00D").mangledNameHash());
     ASSERT_EQ(0x0000006du, ImmutableString("imageAtomicAnd(01C20D00D").mangledNameHash());
-    ASSERT_EQ(0x000006b3u, ImmutableString("imageAtomicAnd(01D20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000077eu, ImmutableString("imageAtomicAnd(01H20D00D").mangledNameHash());
+    ASSERT_EQ(0x000006b4u, ImmutableString("imageAtomicAnd(01D20D00D").mangledNameHash());
+    ASSERT_EQ(0x0000077fu, ImmutableString("imageAtomicAnd(01H20D00D").mangledNameHash());
     ASSERT_EQ(0x00000271u, ImmutableString("imageAtomicAnd(01I20D00D").mangledNameHash());
     ASSERT_EQ(0x00000122u, ImmutableString("imageAtomicAnd(01J20D00D").mangledNameHash());
     ASSERT_EQ(0x00000015u, ImmutableString("imageAtomicAnd(01f00D00D").mangledNameHash());
@@ -1676,20 +1676,20 @@
     ASSERT_EQ(0x00000398u, ImmutableString("imageAtomicAnd(01h00D00D").mangledNameHash());
     ASSERT_EQ(0x0000049au, ImmutableString("imageAtomicAnd(01E20D00D").mangledNameHash());
     ASSERT_EQ(0x00000337u, ImmutableString("imageAtomicAnd(01F20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000806u, ImmutableString("imageAtomicAnd(01G20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000807u, ImmutableString("imageAtomicAnd(01G20D00D").mangledNameHash());
     ASSERT_EQ(0x0000003bu, ImmutableString("imageAtomicAnd(01Z20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000796u, ImmutableString("imageAtomicAnd(01a20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000740u, ImmutableString("imageAtomicAnd(01b20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000797u, ImmutableString("imageAtomicAnd(01a20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000741u, ImmutableString("imageAtomicAnd(01b20D00D").mangledNameHash());
     ASSERT_EQ(0x000004b0u, ImmutableString("imageAtomicAnd(01K00D00D").mangledNameHash());
     ASSERT_EQ(0x0000025au, ImmutableString("imageAtomicAnd(01L00D00D").mangledNameHash());
     ASSERT_EQ(0x00000215u, ImmutableString("imageAtomicAnd(01M00D00D").mangledNameHash());
     ASSERT_EQ(0x00000562u, ImmutableString("imageAtomicAnd(01N10D00D").mangledNameHash());
     ASSERT_EQ(0x000000a7u, ImmutableString("imageAtomicAnd(01O10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000614u, ImmutableString("imageAtomicAnd(01P10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000615u, ImmutableString("imageAtomicAnd(01P10D00D").mangledNameHash());
     ASSERT_EQ(0x000004dau, ImmutableString("imageAtomicAnd(01W10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000069bu, ImmutableString("imageAtomicAnd(01X10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000598u, ImmutableString("imageAtomicAnd(01Y10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000061bu, ImmutableString("imageAtomicAnd(01Q10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000069cu, ImmutableString("imageAtomicAnd(01X10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000599u, ImmutableString("imageAtomicAnd(01Y10D00D").mangledNameHash());
+    ASSERT_EQ(0x0000061cu, ImmutableString("imageAtomicAnd(01Q10D00D00D").mangledNameHash());
     ASSERT_EQ(0x000000c8u, ImmutableString("imageAtomicAnd(01R10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000468u, ImmutableString("imageAtomicAnd(01S10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000195u, ImmutableString("imageAtomicAnd(01T20D00D00D").mangledNameHash());
@@ -1701,32 +1701,32 @@
     ASSERT_EQ(0x000003a6u, ImmutableString("imageAtomicOr(01B20D00E").mangledNameHash());
     ASSERT_EQ(0x0000030bu, ImmutableString("imageAtomicOr(01C20D00E").mangledNameHash());
     ASSERT_EQ(0x000004f6u, ImmutableString("imageAtomicOr(01D20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000084eu, ImmutableString("imageAtomicOr(01H20D00E").mangledNameHash());
+    ASSERT_EQ(0x0000084fu, ImmutableString("imageAtomicOr(01H20D00E").mangledNameHash());
     ASSERT_EQ(0x0000044du, ImmutableString("imageAtomicOr(01I20D00E").mangledNameHash());
     ASSERT_EQ(0x0000050cu, ImmutableString("imageAtomicOr(01J20D00E").mangledNameHash());
     ASSERT_EQ(0x00000261u, ImmutableString("imageAtomicOr(01f00D00E").mangledNameHash());
     ASSERT_EQ(0x00000546u, ImmutableString("imageAtomicOr(01g00D00E").mangledNameHash());
-    ASSERT_EQ(0x0000057bu, ImmutableString("imageAtomicOr(01h00D00E").mangledNameHash());
+    ASSERT_EQ(0x0000057cu, ImmutableString("imageAtomicOr(01h00D00E").mangledNameHash());
     ASSERT_EQ(0x000000b4u, ImmutableString("imageAtomicOr(01E20D00E").mangledNameHash());
     ASSERT_EQ(0x000002e4u, ImmutableString("imageAtomicOr(01F20D00E").mangledNameHash());
     ASSERT_EQ(0x000002a7u, ImmutableString("imageAtomicOr(01G20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000626u, ImmutableString("imageAtomicOr(01Z20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000058au, ImmutableString("imageAtomicOr(01a20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000836u, ImmutableString("imageAtomicOr(01b20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000627u, ImmutableString("imageAtomicOr(01Z20D00E").mangledNameHash());
+    ASSERT_EQ(0x0000058bu, ImmutableString("imageAtomicOr(01a20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000837u, ImmutableString("imageAtomicOr(01b20D00E").mangledNameHash());
     ASSERT_EQ(0x000004a2u, ImmutableString("imageAtomicOr(01K00D00E").mangledNameHash());
     ASSERT_EQ(0x0000012bu, ImmutableString("imageAtomicOr(01L00D00E").mangledNameHash());
     ASSERT_EQ(0x000003efu, ImmutableString("imageAtomicOr(01M00D00E").mangledNameHash());
     ASSERT_EQ(0x0000004au, ImmutableString("imageAtomicOr(01N10D00E").mangledNameHash());
-    ASSERT_EQ(0x000005d3u, ImmutableString("imageAtomicOr(01O10D00E").mangledNameHash());
+    ASSERT_EQ(0x000005d4u, ImmutableString("imageAtomicOr(01O10D00E").mangledNameHash());
     ASSERT_EQ(0x000000eeu, ImmutableString("imageAtomicOr(01P10D00E").mangledNameHash());
     ASSERT_EQ(0x00000366u, ImmutableString("imageAtomicOr(01W10D00E").mangledNameHash());
-    ASSERT_EQ(0x0000066cu, ImmutableString("imageAtomicOr(01X10D00E").mangledNameHash());
+    ASSERT_EQ(0x0000066du, ImmutableString("imageAtomicOr(01X10D00E").mangledNameHash());
     ASSERT_EQ(0x00000199u, ImmutableString("imageAtomicOr(01Y10D00E").mangledNameHash());
     ASSERT_EQ(0x00000037u, ImmutableString("imageAtomicOr(01Q10D00D00E").mangledNameHash());
     ASSERT_EQ(0x000000c4u, ImmutableString("imageAtomicOr(01R10D00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000849u, ImmutableString("imageAtomicOr(01S10D00D00E").mangledNameHash());
+    ASSERT_EQ(0x0000084au, ImmutableString("imageAtomicOr(01S10D00D00E").mangledNameHash());
     ASSERT_EQ(0x0000037au, ImmutableString("imageAtomicOr(01T20D00D00E").mangledNameHash());
-    ASSERT_EQ(0x000006bau, ImmutableString("imageAtomicOr(01U20D00D00E").mangledNameHash());
+    ASSERT_EQ(0x000006bbu, ImmutableString("imageAtomicOr(01U20D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000460u, ImmutableString("imageAtomicOr(01V20D00D00E").mangledNameHash());
     ASSERT_EQ(0x000002e2u, ImmutableString("imageAtomicOr(00y10D00D").mangledNameHash());
     ASSERT_EQ(0x00000003u, ImmutableString("imageAtomicOr(00z10D00D").mangledNameHash());
@@ -1734,48 +1734,48 @@
     ASSERT_EQ(0x000003a7u, ImmutableString("imageAtomicOr(01B20D00D").mangledNameHash());
     ASSERT_EQ(0x0000030au, ImmutableString("imageAtomicOr(01C20D00D").mangledNameHash());
     ASSERT_EQ(0x000004f8u, ImmutableString("imageAtomicOr(01D20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000084fu, ImmutableString("imageAtomicOr(01H20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000667u, ImmutableString("imageAtomicOr(01I20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000850u, ImmutableString("imageAtomicOr(01H20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000668u, ImmutableString("imageAtomicOr(01I20D00D").mangledNameHash());
     ASSERT_EQ(0x0000050du, ImmutableString("imageAtomicOr(01J20D00D").mangledNameHash());
     ASSERT_EQ(0x00000262u, ImmutableString("imageAtomicOr(01f00D00D").mangledNameHash());
     ASSERT_EQ(0x00000545u, ImmutableString("imageAtomicOr(01g00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000057cu, ImmutableString("imageAtomicOr(01h00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000057du, ImmutableString("imageAtomicOr(01h00D00D").mangledNameHash());
     ASSERT_EQ(0x000000b3u, ImmutableString("imageAtomicOr(01E20D00D").mangledNameHash());
     ASSERT_EQ(0x000002e5u, ImmutableString("imageAtomicOr(01F20D00D").mangledNameHash());
     ASSERT_EQ(0x000002a6u, ImmutableString("imageAtomicOr(01G20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000627u, ImmutableString("imageAtomicOr(01Z20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000628u, ImmutableString("imageAtomicOr(01Z20D00D").mangledNameHash());
     ASSERT_EQ(0x00000263u, ImmutableString("imageAtomicOr(01a20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000837u, ImmutableString("imageAtomicOr(01b20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000838u, ImmutableString("imageAtomicOr(01b20D00D").mangledNameHash());
     ASSERT_EQ(0x000004a1u, ImmutableString("imageAtomicOr(01K00D00D").mangledNameHash());
     ASSERT_EQ(0x0000012cu, ImmutableString("imageAtomicOr(01L00D00D").mangledNameHash());
     ASSERT_EQ(0x000000a2u, ImmutableString("imageAtomicOr(01M00D00D").mangledNameHash());
     ASSERT_EQ(0x00000049u, ImmutableString("imageAtomicOr(01N10D00D").mangledNameHash());
-    ASSERT_EQ(0x000005d4u, ImmutableString("imageAtomicOr(01O10D00D").mangledNameHash());
+    ASSERT_EQ(0x000005d5u, ImmutableString("imageAtomicOr(01O10D00D").mangledNameHash());
     ASSERT_EQ(0x000000edu, ImmutableString("imageAtomicOr(01P10D00D").mangledNameHash());
     ASSERT_EQ(0x00000367u, ImmutableString("imageAtomicOr(01W10D00D").mangledNameHash());
-    ASSERT_EQ(0x0000066au, ImmutableString("imageAtomicOr(01X10D00D").mangledNameHash());
+    ASSERT_EQ(0x0000066bu, ImmutableString("imageAtomicOr(01X10D00D").mangledNameHash());
     ASSERT_EQ(0x0000019au, ImmutableString("imageAtomicOr(01Y10D00D").mangledNameHash());
     ASSERT_EQ(0x00000036u, ImmutableString("imageAtomicOr(01Q10D00D00D").mangledNameHash());
     ASSERT_EQ(0x000000c5u, ImmutableString("imageAtomicOr(01R10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000848u, ImmutableString("imageAtomicOr(01S10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000849u, ImmutableString("imageAtomicOr(01S10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000379u, ImmutableString("imageAtomicOr(01T20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000006c3u, ImmutableString("imageAtomicOr(01U20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000006c4u, ImmutableString("imageAtomicOr(01U20D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000045fu, ImmutableString("imageAtomicOr(01V20D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000447u, ImmutableString("imageAtomicXor(00y10D00E").mangledNameHash());
     ASSERT_EQ(0x0000007bu, ImmutableString("imageAtomicXor(00z10D00E").mangledNameHash());
     ASSERT_EQ(0x00000421u, ImmutableString("imageAtomicXor(01A10D00E").mangledNameHash());
     ASSERT_EQ(0x000000c2u, ImmutableString("imageAtomicXor(01B20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000596u, ImmutableString("imageAtomicXor(01C20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000063au, ImmutableString("imageAtomicXor(01D20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000597u, ImmutableString("imageAtomicXor(01C20D00E").mangledNameHash());
+    ASSERT_EQ(0x0000063bu, ImmutableString("imageAtomicXor(01D20D00E").mangledNameHash());
     ASSERT_EQ(0x000000acu, ImmutableString("imageAtomicXor(01H20D00E").mangledNameHash());
     ASSERT_EQ(0x00000203u, ImmutableString("imageAtomicXor(01I20D00E").mangledNameHash());
-    ASSERT_EQ(0x000007eau, ImmutableString("imageAtomicXor(01J20D00E").mangledNameHash());
-    ASSERT_EQ(0x000005b0u, ImmutableString("imageAtomicXor(01f00D00E").mangledNameHash());
+    ASSERT_EQ(0x000007ebu, ImmutableString("imageAtomicXor(01J20D00E").mangledNameHash());
+    ASSERT_EQ(0x000005b1u, ImmutableString("imageAtomicXor(01f00D00E").mangledNameHash());
     ASSERT_EQ(0x0000030cu, ImmutableString("imageAtomicXor(01g00D00E").mangledNameHash());
     ASSERT_EQ(0x00000251u, ImmutableString("imageAtomicXor(01h00D00E").mangledNameHash());
-    ASSERT_EQ(0x00000855u, ImmutableString("imageAtomicXor(01E20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000856u, ImmutableString("imageAtomicXor(01E20D00E").mangledNameHash());
     ASSERT_EQ(0x00000142u, ImmutableString("imageAtomicXor(01F20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000757u, ImmutableString("imageAtomicXor(01G20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000758u, ImmutableString("imageAtomicXor(01G20D00E").mangledNameHash());
     ASSERT_EQ(0x000002a1u, ImmutableString("imageAtomicXor(01Z20D00E").mangledNameHash());
     ASSERT_EQ(0x00000085u, ImmutableString("imageAtomicXor(01a20D00E").mangledNameHash());
     ASSERT_EQ(0x000001c6u, ImmutableString("imageAtomicXor(01b20D00E").mangledNameHash());
@@ -1783,8 +1783,8 @@
     ASSERT_EQ(0x000001a5u, ImmutableString("imageAtomicXor(01L00D00E").mangledNameHash());
     ASSERT_EQ(0x0000055eu, ImmutableString("imageAtomicXor(01M00D00E").mangledNameHash());
     ASSERT_EQ(0x000000efu, ImmutableString("imageAtomicXor(01N10D00E").mangledNameHash());
-    ASSERT_EQ(0x000007c7u, ImmutableString("imageAtomicXor(01O10D00E").mangledNameHash());
-    ASSERT_EQ(0x00000666u, ImmutableString("imageAtomicXor(01P10D00E").mangledNameHash());
+    ASSERT_EQ(0x000007c8u, ImmutableString("imageAtomicXor(01O10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000667u, ImmutableString("imageAtomicXor(01P10D00E").mangledNameHash());
     ASSERT_EQ(0x00000425u, ImmutableString("imageAtomicXor(01W10D00E").mangledNameHash());
     ASSERT_EQ(0x0000052fu, ImmutableString("imageAtomicXor(01X10D00E").mangledNameHash());
     ASSERT_EQ(0x00000068u, ImmutableString("imageAtomicXor(01Y10D00E").mangledNameHash());
@@ -1798,25 +1798,25 @@
     ASSERT_EQ(0x00000435u, ImmutableString("imageAtomicXor(00z10D00D").mangledNameHash());
     ASSERT_EQ(0x00000420u, ImmutableString("imageAtomicXor(01A10D00D").mangledNameHash());
     ASSERT_EQ(0x000000c1u, ImmutableString("imageAtomicXor(01B20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000816u, ImmutableString("imageAtomicXor(01C20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000639u, ImmutableString("imageAtomicXor(01D20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000817u, ImmutableString("imageAtomicXor(01C20D00D").mangledNameHash());
+    ASSERT_EQ(0x0000063au, ImmutableString("imageAtomicXor(01D20D00D").mangledNameHash());
     ASSERT_EQ(0x000000abu, ImmutableString("imageAtomicXor(01H20D00D").mangledNameHash());
     ASSERT_EQ(0x00000204u, ImmutableString("imageAtomicXor(01I20D00D").mangledNameHash());
-    ASSERT_EQ(0x000007e9u, ImmutableString("imageAtomicXor(01J20D00D").mangledNameHash());
-    ASSERT_EQ(0x000005afu, ImmutableString("imageAtomicXor(01f00D00D").mangledNameHash());
+    ASSERT_EQ(0x000007eau, ImmutableString("imageAtomicXor(01J20D00D").mangledNameHash());
+    ASSERT_EQ(0x000005b0u, ImmutableString("imageAtomicXor(01f00D00D").mangledNameHash());
     ASSERT_EQ(0x00000315u, ImmutableString("imageAtomicXor(01g00D00D").mangledNameHash());
     ASSERT_EQ(0x00000250u, ImmutableString("imageAtomicXor(01h00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000856u, ImmutableString("imageAtomicXor(01E20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000788u, ImmutableString("imageAtomicXor(01F20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000758u, ImmutableString("imageAtomicXor(01G20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000857u, ImmutableString("imageAtomicXor(01E20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000789u, ImmutableString("imageAtomicXor(01F20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000759u, ImmutableString("imageAtomicXor(01G20D00D").mangledNameHash());
     ASSERT_EQ(0x000002a0u, ImmutableString("imageAtomicXor(01Z20D00D").mangledNameHash());
     ASSERT_EQ(0x00000086u, ImmutableString("imageAtomicXor(01a20D00D").mangledNameHash());
     ASSERT_EQ(0x00000238u, ImmutableString("imageAtomicXor(01b20D00D").mangledNameHash());
-    ASSERT_EQ(0x000006bcu, ImmutableString("imageAtomicXor(01K00D00D").mangledNameHash());
+    ASSERT_EQ(0x000006bdu, ImmutableString("imageAtomicXor(01K00D00D").mangledNameHash());
     ASSERT_EQ(0x00000326u, ImmutableString("imageAtomicXor(01L00D00D").mangledNameHash());
     ASSERT_EQ(0x0000055fu, ImmutableString("imageAtomicXor(01M00D00D").mangledNameHash());
     ASSERT_EQ(0x000000f0u, ImmutableString("imageAtomicXor(01N10D00D").mangledNameHash());
-    ASSERT_EQ(0x000007c6u, ImmutableString("imageAtomicXor(01O10D00D").mangledNameHash());
+    ASSERT_EQ(0x000007c7u, ImmutableString("imageAtomicXor(01O10D00D").mangledNameHash());
     ASSERT_EQ(0x0000028au, ImmutableString("imageAtomicXor(01P10D00D").mangledNameHash());
     ASSERT_EQ(0x00000424u, ImmutableString("imageAtomicXor(01W10D00D").mangledNameHash());
     ASSERT_EQ(0x00000530u, ImmutableString("imageAtomicXor(01X10D00D").mangledNameHash());
@@ -1831,9 +1831,9 @@
     ASSERT_EQ(0x00000513u, ImmutableString("imageAtomicExchange(00z10D00E").mangledNameHash());
     ASSERT_EQ(0x00000236u, ImmutableString("imageAtomicExchange(01A10D00E").mangledNameHash());
     ASSERT_EQ(0x00000492u, ImmutableString("imageAtomicExchange(01B20D00E").mangledNameHash());
-    ASSERT_EQ(0x000007abu, ImmutableString("imageAtomicExchange(01C20D00E").mangledNameHash());
+    ASSERT_EQ(0x000007acu, ImmutableString("imageAtomicExchange(01C20D00E").mangledNameHash());
     ASSERT_EQ(0x0000037cu, ImmutableString("imageAtomicExchange(01D20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000065fu, ImmutableString("imageAtomicExchange(01H20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000660u, ImmutableString("imageAtomicExchange(01H20D00E").mangledNameHash());
     ASSERT_EQ(0x0000046du, ImmutableString("imageAtomicExchange(01I20D00E").mangledNameHash());
     ASSERT_EQ(0x000003ecu, ImmutableString("imageAtomicExchange(01J20D00E").mangledNameHash());
     ASSERT_EQ(0x00000131u, ImmutableString("imageAtomicExchange(01f00D00E").mangledNameHash());
@@ -1841,102 +1841,102 @@
     ASSERT_EQ(0x00000504u, ImmutableString("imageAtomicExchange(01h00D00E").mangledNameHash());
     ASSERT_EQ(0x0000035au, ImmutableString("imageAtomicExchange(01E20D00E").mangledNameHash());
     ASSERT_EQ(0x000001cau, ImmutableString("imageAtomicExchange(01F20D00E").mangledNameHash());
-    ASSERT_EQ(0x00000604u, ImmutableString("imageAtomicExchange(01G20D00E").mangledNameHash());
+    ASSERT_EQ(0x00000605u, ImmutableString("imageAtomicExchange(01G20D00E").mangledNameHash());
     ASSERT_EQ(0x0000012fu, ImmutableString("imageAtomicExchange(01Z20D00E").mangledNameHash());
-    ASSERT_EQ(0x0000076eu, ImmutableString("imageAtomicExchange(01a20D00E").mangledNameHash());
+    ASSERT_EQ(0x0000076fu, ImmutableString("imageAtomicExchange(01a20D00E").mangledNameHash());
     ASSERT_EQ(0x0000004bu, ImmutableString("imageAtomicExchange(01b20D00E").mangledNameHash());
     ASSERT_EQ(0x00000517u, ImmutableString("imageAtomicExchange(01K00D00E").mangledNameHash());
-    ASSERT_EQ(0x000005ceu, ImmutableString("imageAtomicExchange(01L00D00E").mangledNameHash());
+    ASSERT_EQ(0x000005cfu, ImmutableString("imageAtomicExchange(01L00D00E").mangledNameHash());
     ASSERT_EQ(0x000001ccu, ImmutableString("imageAtomicExchange(01M00D00E").mangledNameHash());
     ASSERT_EQ(0x0000023eu, ImmutableString("imageAtomicExchange(01N10D00E").mangledNameHash());
-    ASSERT_EQ(0x00000637u, ImmutableString("imageAtomicExchange(01O10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000638u, ImmutableString("imageAtomicExchange(01O10D00E").mangledNameHash());
     ASSERT_EQ(0x00000465u, ImmutableString("imageAtomicExchange(01P10D00E").mangledNameHash());
     ASSERT_EQ(0x00000170u, ImmutableString("imageAtomicExchange(01W10D00E").mangledNameHash());
     ASSERT_EQ(0x000002b5u, ImmutableString("imageAtomicExchange(01X10D00E").mangledNameHash());
-    ASSERT_EQ(0x00000634u, ImmutableString("imageAtomicExchange(01Y10D00E").mangledNameHash());
+    ASSERT_EQ(0x00000635u, ImmutableString("imageAtomicExchange(01Y10D00E").mangledNameHash());
     ASSERT_EQ(0x0000041au, ImmutableString("imageAtomicExchange(01Q10D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000444u, ImmutableString("imageAtomicExchange(01R10D00D00E").mangledNameHash());
     ASSERT_EQ(0x00000181u, ImmutableString("imageAtomicExchange(01S10D00D00E").mangledNameHash());
     ASSERT_EQ(0x000002c5u, ImmutableString("imageAtomicExchange(01T20D00D00E").mangledNameHash());
-    ASSERT_EQ(0x000005dcu, ImmutableString("imageAtomicExchange(01U20D00D00E").mangledNameHash());
+    ASSERT_EQ(0x000005ddu, ImmutableString("imageAtomicExchange(01U20D00D00E").mangledNameHash());
     ASSERT_EQ(0x0000021bu, ImmutableString("imageAtomicExchange(01V20D00D00E").mangledNameHash());
     ASSERT_EQ(0x0000021fu, ImmutableString("imageAtomicExchange(00y10D00D").mangledNameHash());
     ASSERT_EQ(0x00000514u, ImmutableString("imageAtomicExchange(00z10D00D").mangledNameHash());
     ASSERT_EQ(0x00000237u, ImmutableString("imageAtomicExchange(01A10D00D").mangledNameHash());
     ASSERT_EQ(0x00000493u, ImmutableString("imageAtomicExchange(01B20D00D").mangledNameHash());
-    ASSERT_EQ(0x000007aau, ImmutableString("imageAtomicExchange(01C20D00D").mangledNameHash());
+    ASSERT_EQ(0x000007abu, ImmutableString("imageAtomicExchange(01C20D00D").mangledNameHash());
     ASSERT_EQ(0x000004a8u, ImmutableString("imageAtomicExchange(01D20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000660u, ImmutableString("imageAtomicExchange(01H20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000661u, ImmutableString("imageAtomicExchange(01H20D00D").mangledNameHash());
     ASSERT_EQ(0x0000046cu, ImmutableString("imageAtomicExchange(01I20D00D").mangledNameHash());
     ASSERT_EQ(0x000003edu, ImmutableString("imageAtomicExchange(01J20D00D").mangledNameHash());
     ASSERT_EQ(0x00000132u, ImmutableString("imageAtomicExchange(01f00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000068eu, ImmutableString("imageAtomicExchange(01g00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000068fu, ImmutableString("imageAtomicExchange(01g00D00D").mangledNameHash());
     ASSERT_EQ(0x00000505u, ImmutableString("imageAtomicExchange(01h00D00D").mangledNameHash());
     ASSERT_EQ(0x00000359u, ImmutableString("imageAtomicExchange(01E20D00D").mangledNameHash());
     ASSERT_EQ(0x000000b8u, ImmutableString("imageAtomicExchange(01F20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000603u, ImmutableString("imageAtomicExchange(01G20D00D").mangledNameHash());
+    ASSERT_EQ(0x00000604u, ImmutableString("imageAtomicExchange(01G20D00D").mangledNameHash());
     ASSERT_EQ(0x00000130u, ImmutableString("imageAtomicExchange(01Z20D00D").mangledNameHash());
-    ASSERT_EQ(0x0000076du, ImmutableString("imageAtomicExchange(01a20D00D").mangledNameHash());
+    ASSERT_EQ(0x0000076eu, ImmutableString("imageAtomicExchange(01a20D00D").mangledNameHash());
     ASSERT_EQ(0x0000004cu, ImmutableString("imageAtomicExchange(01b20D00D").mangledNameHash());
     ASSERT_EQ(0x000004b4u, ImmutableString("imageAtomicExchange(01K00D00D").mangledNameHash());
     ASSERT_EQ(0x000004d9u, ImmutableString("imageAtomicExchange(01L00D00D").mangledNameHash());
     ASSERT_EQ(0x000001cbu, ImmutableString("imageAtomicExchange(01M00D00D").mangledNameHash());
     ASSERT_EQ(0x00000069u, ImmutableString("imageAtomicExchange(01N10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000781u, ImmutableString("imageAtomicExchange(01O10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000782u, ImmutableString("imageAtomicExchange(01O10D00D").mangledNameHash());
     ASSERT_EQ(0x00000461u, ImmutableString("imageAtomicExchange(01P10D00D").mangledNameHash());
     ASSERT_EQ(0x00000171u, ImmutableString("imageAtomicExchange(01W10D00D").mangledNameHash());
     ASSERT_EQ(0x000002b4u, ImmutableString("imageAtomicExchange(01X10D00D").mangledNameHash());
-    ASSERT_EQ(0x00000635u, ImmutableString("imageAtomicExchange(01Y10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000636u, ImmutableString("imageAtomicExchange(01Y10D00D").mangledNameHash());
     ASSERT_EQ(0x00000419u, ImmutableString("imageAtomicExchange(01Q10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000445u, ImmutableString("imageAtomicExchange(01R10D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000027fu, ImmutableString("imageAtomicExchange(01S10D00D00D").mangledNameHash());
     ASSERT_EQ(0x000002c4u, ImmutableString("imageAtomicExchange(01T20D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000005e0u, ImmutableString("imageAtomicExchange(01U20D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000005e1u, ImmutableString("imageAtomicExchange(01U20D00D00D").mangledNameHash());
     ASSERT_EQ(0x000003eau, ImmutableString("imageAtomicExchange(01V20D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000021eu, ImmutableString("imageAtomicExchange(00y10D00B").mangledNameHash());
     ASSERT_EQ(0x00000512u, ImmutableString("imageAtomicExchange(00z10D00B").mangledNameHash());
     ASSERT_EQ(0x00000234u, ImmutableString("imageAtomicExchange(01A10D00B").mangledNameHash());
     ASSERT_EQ(0x00000268u, ImmutableString("imageAtomicExchange(01B20D00B").mangledNameHash());
-    ASSERT_EQ(0x000007aeu, ImmutableString("imageAtomicExchange(01C20D00B").mangledNameHash());
+    ASSERT_EQ(0x000007afu, ImmutableString("imageAtomicExchange(01C20D00B").mangledNameHash());
     ASSERT_EQ(0x0000037eu, ImmutableString("imageAtomicExchange(01D20D00B").mangledNameHash());
-    ASSERT_EQ(0x0000065cu, ImmutableString("imageAtomicExchange(01H20D00B").mangledNameHash());
+    ASSERT_EQ(0x0000065du, ImmutableString("imageAtomicExchange(01H20D00B").mangledNameHash());
     ASSERT_EQ(0x0000046eu, ImmutableString("imageAtomicExchange(01I20D00B").mangledNameHash());
     ASSERT_EQ(0x000003ebu, ImmutableString("imageAtomicExchange(01J20D00B").mangledNameHash());
-    ASSERT_EQ(0x00000731u, ImmutableString("imageAtomicExchange(01f00D00B").mangledNameHash());
-    ASSERT_EQ(0x0000080eu, ImmutableString("imageAtomicExchange(01g00D00B").mangledNameHash());
+    ASSERT_EQ(0x00000732u, ImmutableString("imageAtomicExchange(01f00D00B").mangledNameHash());
+    ASSERT_EQ(0x0000080fu, ImmutableString("imageAtomicExchange(01g00D00B").mangledNameHash());
     ASSERT_EQ(0x00000507u, ImmutableString("imageAtomicExchange(01h00D00B").mangledNameHash());
     ASSERT_EQ(0x00000201u, ImmutableString("imageAtomicExchange(01E20D00B").mangledNameHash());
     ASSERT_EQ(0x000000bbu, ImmutableString("imageAtomicExchange(01F20D00B").mangledNameHash());
-    ASSERT_EQ(0x00000601u, ImmutableString("imageAtomicExchange(01G20D00B").mangledNameHash());
+    ASSERT_EQ(0x00000602u, ImmutableString("imageAtomicExchange(01G20D00B").mangledNameHash());
     ASSERT_EQ(0x0000012eu, ImmutableString("imageAtomicExchange(01Z20D00B").mangledNameHash());
-    ASSERT_EQ(0x0000076fu, ImmutableString("imageAtomicExchange(01a20D00B").mangledNameHash());
+    ASSERT_EQ(0x00000770u, ImmutableString("imageAtomicExchange(01a20D00B").mangledNameHash());
     ASSERT_EQ(0x0000015bu, ImmutableString("imageAtomicExchange(01b20D00B").mangledNameHash());
     ASSERT_EQ(0x00000518u, ImmutableString("imageAtomicExchange(01K00D00B").mangledNameHash());
     ASSERT_EQ(0x000003bbu, ImmutableString("imageAtomicExchange(01L00D00B").mangledNameHash());
     ASSERT_EQ(0x000001c9u, ImmutableString("imageAtomicExchange(01M00D00B").mangledNameHash());
     ASSERT_EQ(0x0000024au, ImmutableString("imageAtomicExchange(01N10D00B").mangledNameHash());
-    ASSERT_EQ(0x00000636u, ImmutableString("imageAtomicExchange(01O10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000637u, ImmutableString("imageAtomicExchange(01O10D00B").mangledNameHash());
     ASSERT_EQ(0x00000295u, ImmutableString("imageAtomicExchange(01P10D00B").mangledNameHash());
     ASSERT_EQ(0x0000016fu, ImmutableString("imageAtomicExchange(01W10D00B").mangledNameHash());
-    ASSERT_EQ(0x0000075au, ImmutableString("imageAtomicExchange(01X10D00B").mangledNameHash());
-    ASSERT_EQ(0x00000632u, ImmutableString("imageAtomicExchange(01Y10D00B").mangledNameHash());
+    ASSERT_EQ(0x0000075bu, ImmutableString("imageAtomicExchange(01X10D00B").mangledNameHash());
+    ASSERT_EQ(0x00000633u, ImmutableString("imageAtomicExchange(01Y10D00B").mangledNameHash());
     ASSERT_EQ(0x0000041bu, ImmutableString("imageAtomicExchange(01Q10D00D00B").mangledNameHash());
     ASSERT_EQ(0x0000001fu, ImmutableString("imageAtomicExchange(01R10D00D00B").mangledNameHash());
     ASSERT_EQ(0x000001d8u, ImmutableString("imageAtomicExchange(01S10D00D00B").mangledNameHash());
     ASSERT_EQ(0x0000054du, ImmutableString("imageAtomicExchange(01T20D00D00B").mangledNameHash());
-    ASSERT_EQ(0x000005d9u, ImmutableString("imageAtomicExchange(01U20D00D00B").mangledNameHash());
+    ASSERT_EQ(0x000005dau, ImmutableString("imageAtomicExchange(01U20D00D00B").mangledNameHash());
     ASSERT_EQ(0x0000021cu, ImmutableString("imageAtomicExchange(01V20D00D00B").mangledNameHash());
     ASSERT_EQ(0x00000279u, ImmutableString("imageAtomicCompSwap(00y10D00E00E").mangledNameHash());
     ASSERT_EQ(0x0000040du, ImmutableString("imageAtomicCompSwap(00z10D00E00E").mangledNameHash());
     ASSERT_EQ(0x00000404u, ImmutableString("imageAtomicCompSwap(01A10D00E00E").mangledNameHash());
     ASSERT_EQ(0x0000020au, ImmutableString("imageAtomicCompSwap(01B20D00E00E").mangledNameHash());
-    ASSERT_EQ(0x00000782u, ImmutableString("imageAtomicCompSwap(01C20D00E00E").mangledNameHash());
-    ASSERT_EQ(0x000006f9u, ImmutableString("imageAtomicCompSwap(01D20D00E00E").mangledNameHash());
-    ASSERT_EQ(0x0000065eu, ImmutableString("imageAtomicCompSwap(01H20D00E00E").mangledNameHash());
+    ASSERT_EQ(0x00000783u, ImmutableString("imageAtomicCompSwap(01C20D00E00E").mangledNameHash());
+    ASSERT_EQ(0x000006fau, ImmutableString("imageAtomicCompSwap(01D20D00E00E").mangledNameHash());
+    ASSERT_EQ(0x0000065fu, ImmutableString("imageAtomicCompSwap(01H20D00E00E").mangledNameHash());
     ASSERT_EQ(0x000000d8u, ImmutableString("imageAtomicCompSwap(01I20D00E00E").mangledNameHash());
     ASSERT_EQ(0x0000005au, ImmutableString("imageAtomicCompSwap(01J20D00E00E").mangledNameHash());
     ASSERT_EQ(0x0000049eu, ImmutableString("imageAtomicCompSwap(01f00D00E00E").mangledNameHash());
-    ASSERT_EQ(0x000007c4u, ImmutableString("imageAtomicCompSwap(01g00D00E00E").mangledNameHash());
+    ASSERT_EQ(0x000007c5u, ImmutableString("imageAtomicCompSwap(01g00D00E00E").mangledNameHash());
     ASSERT_EQ(0x0000020eu, ImmutableString("imageAtomicCompSwap(01h00D00E00E").mangledNameHash());
     ASSERT_EQ(0x00000134u, ImmutableString("imageAtomicCompSwap(01E20D00E00E").mangledNameHash());
     ASSERT_EQ(0x000001cdu, ImmutableString("imageAtomicCompSwap(01F20D00E00E").mangledNameHash());
@@ -1945,15 +1945,15 @@
     ASSERT_EQ(0x00000028u, ImmutableString("imageAtomicCompSwap(01a20D00E00E").mangledNameHash());
     ASSERT_EQ(0x0000033fu, ImmutableString("imageAtomicCompSwap(01b20D00E00E").mangledNameHash());
     ASSERT_EQ(0x0000045eu, ImmutableString("imageAtomicCompSwap(01K00D00E00E").mangledNameHash());
-    ASSERT_EQ(0x0000059cu, ImmutableString("imageAtomicCompSwap(01L00D00E00E").mangledNameHash());
+    ASSERT_EQ(0x0000059du, ImmutableString("imageAtomicCompSwap(01L00D00E00E").mangledNameHash());
     ASSERT_EQ(0x000002c0u, ImmutableString("imageAtomicCompSwap(01M00D00E00E").mangledNameHash());
-    ASSERT_EQ(0x00000584u, ImmutableString("imageAtomicCompSwap(01N10D00E00E").mangledNameHash());
+    ASSERT_EQ(0x00000585u, ImmutableString("imageAtomicCompSwap(01N10D00E00E").mangledNameHash());
     ASSERT_EQ(0x00000140u, ImmutableString("imageAtomicCompSwap(01O10D00E00E").mangledNameHash());
     ASSERT_EQ(0x0000008cu, ImmutableString("imageAtomicCompSwap(01P10D00E00E").mangledNameHash());
     ASSERT_EQ(0x000001e5u, ImmutableString("imageAtomicCompSwap(01W10D00E00E").mangledNameHash());
     ASSERT_EQ(0x00000112u, ImmutableString("imageAtomicCompSwap(01X10D00E00E").mangledNameHash());
     ASSERT_EQ(0x0000021du, ImmutableString("imageAtomicCompSwap(01Y10D00E00E").mangledNameHash());
-    ASSERT_EQ(0x000007c5u,
+    ASSERT_EQ(0x000007c6u,
               ImmutableString("imageAtomicCompSwap(01Q10D00D00E00E").mangledNameHash());
     ASSERT_EQ(0x00000390u,
               ImmutableString("imageAtomicCompSwap(01R10D00D00E00E").mangledNameHash());
@@ -1961,12 +1961,12 @@
               ImmutableString("imageAtomicCompSwap(01S10D00D00E00E").mangledNameHash());
     ASSERT_EQ(0x00000298u,
               ImmutableString("imageAtomicCompSwap(01T20D00D00E00E").mangledNameHash());
-    ASSERT_EQ(0x00000677u,
+    ASSERT_EQ(0x00000678u,
               ImmutableString("imageAtomicCompSwap(01U20D00D00E00E").mangledNameHash());
-    ASSERT_EQ(0x00000746u,
+    ASSERT_EQ(0x00000747u,
               ImmutableString("imageAtomicCompSwap(01V20D00D00E00E").mangledNameHash());
     ASSERT_EQ(0x000004b5u, ImmutableString("imageAtomicCompSwap(00y10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000771u, ImmutableString("imageAtomicCompSwap(00z10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000772u, ImmutableString("imageAtomicCompSwap(00z10D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000006fu, ImmutableString("imageAtomicCompSwap(01A10D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000342u, ImmutableString("imageAtomicCompSwap(01B20D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000422u, ImmutableString("imageAtomicCompSwap(01C20D00D00D").mangledNameHash());
@@ -1975,7 +1975,7 @@
     ASSERT_EQ(0x000002beu, ImmutableString("imageAtomicCompSwap(01I20D00D00D").mangledNameHash());
     ASSERT_EQ(0x000003a9u, ImmutableString("imageAtomicCompSwap(01J20D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000000cu, ImmutableString("imageAtomicCompSwap(01f00D00D00D").mangledNameHash());
-    ASSERT_EQ(0x000006a9u, ImmutableString("imageAtomicCompSwap(01g00D00D00D").mangledNameHash());
+    ASSERT_EQ(0x000006aau, ImmutableString("imageAtomicCompSwap(01g00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000303u, ImmutableString("imageAtomicCompSwap(01h00D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000000au, ImmutableString("imageAtomicCompSwap(01E20D00D00D").mangledNameHash());
     ASSERT_EQ(0x000002f1u, ImmutableString("imageAtomicCompSwap(01F20D00D00D").mangledNameHash());
@@ -1984,19 +1984,19 @@
     ASSERT_EQ(0x0000056au, ImmutableString("imageAtomicCompSwap(01a20D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000002fu, ImmutableString("imageAtomicCompSwap(01b20D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000126u, ImmutableString("imageAtomicCompSwap(01K00D00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000061cu, ImmutableString("imageAtomicCompSwap(01L00D00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000061du, ImmutableString("imageAtomicCompSwap(01L00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000193u, ImmutableString("imageAtomicCompSwap(01M00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000211u, ImmutableString("imageAtomicCompSwap(01N10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000641u, ImmutableString("imageAtomicCompSwap(01O10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000068au, ImmutableString("imageAtomicCompSwap(01P10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000642u, ImmutableString("imageAtomicCompSwap(01O10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000068bu, ImmutableString("imageAtomicCompSwap(01P10D00D00D").mangledNameHash());
     ASSERT_EQ(0x0000030eu, ImmutableString("imageAtomicCompSwap(01W10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x00000842u, ImmutableString("imageAtomicCompSwap(01X10D00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000066bu, ImmutableString("imageAtomicCompSwap(01Y10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x00000843u, ImmutableString("imageAtomicCompSwap(01X10D00D00D").mangledNameHash());
+    ASSERT_EQ(0x0000066cu, ImmutableString("imageAtomicCompSwap(01Y10D00D00D").mangledNameHash());
     ASSERT_EQ(0x000000a8u,
               ImmutableString("imageAtomicCompSwap(01Q10D00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000029u,
               ImmutableString("imageAtomicCompSwap(01R10D00D00D00D").mangledNameHash());
-    ASSERT_EQ(0x0000062cu,
+    ASSERT_EQ(0x0000062du,
               ImmutableString("imageAtomicCompSwap(01S10D00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000356u,
               ImmutableString("imageAtomicCompSwap(01T20D00D00D00D").mangledNameHash());
@@ -2006,47 +2006,47 @@
               ImmutableString("imageAtomicCompSwap(01V20D00D00D00D").mangledNameHash());
     ASSERT_EQ(0x00000370u, ImmutableString("imageLoad(00y10D").mangledNameHash());
     ASSERT_EQ(0x00000343u, ImmutableString("imageLoad(00z10D").mangledNameHash());
-    ASSERT_EQ(0x00000659u, ImmutableString("imageLoad(01A10D").mangledNameHash());
+    ASSERT_EQ(0x0000065au, ImmutableString("imageLoad(01A10D").mangledNameHash());
     ASSERT_EQ(0x000001b9u, ImmutableString("imageLoad(01B20D").mangledNameHash());
-    ASSERT_EQ(0x0000070au, ImmutableString("imageLoad(01C20D").mangledNameHash());
+    ASSERT_EQ(0x0000070bu, ImmutableString("imageLoad(01C20D").mangledNameHash());
     ASSERT_EQ(0x000001e9u, ImmutableString("imageLoad(01D20D").mangledNameHash());
-    ASSERT_EQ(0x000007fau, ImmutableString("imageLoad(01E20D").mangledNameHash());
+    ASSERT_EQ(0x000007fbu, ImmutableString("imageLoad(01E20D").mangledNameHash());
     ASSERT_EQ(0x0000002du, ImmutableString("imageLoad(01F20D").mangledNameHash());
-    ASSERT_EQ(0x00000779u, ImmutableString("imageLoad(01G20D").mangledNameHash());
+    ASSERT_EQ(0x0000077au, ImmutableString("imageLoad(01G20D").mangledNameHash());
     ASSERT_EQ(0x000002adu, ImmutableString("imageLoad(01H20D").mangledNameHash());
     ASSERT_EQ(0x00000008u, ImmutableString("imageLoad(01I20D").mangledNameHash());
     ASSERT_EQ(0x0000055au, ImmutableString("imageLoad(01J20D").mangledNameHash());
     ASSERT_EQ(0x0000051fu, ImmutableString("imageLoad(01f00D").mangledNameHash());
     ASSERT_EQ(0x00000007u, ImmutableString("imageLoad(01g00D").mangledNameHash());
     ASSERT_EQ(0x00000133u, ImmutableString("imageLoad(01h00D").mangledNameHash());
-    ASSERT_EQ(0x000007d9u, ImmutableString("imageLoad(01Z20D").mangledNameHash());
+    ASSERT_EQ(0x000007dau, ImmutableString("imageLoad(01Z20D").mangledNameHash());
     ASSERT_EQ(0x00000430u, ImmutableString("imageLoad(01a20D").mangledNameHash());
-    ASSERT_EQ(0x000006c9u, ImmutableString("imageLoad(01b20D").mangledNameHash());
+    ASSERT_EQ(0x000006cau, ImmutableString("imageLoad(01b20D").mangledNameHash());
     ASSERT_EQ(0x00000119u, ImmutableString("imageLoad(01K00D").mangledNameHash());
     ASSERT_EQ(0x00000462u, ImmutableString("imageLoad(01L00D").mangledNameHash());
-    ASSERT_EQ(0x0000059bu, ImmutableString("imageLoad(01M00D").mangledNameHash());
-    ASSERT_EQ(0x00000624u, ImmutableString("imageLoad(01N10D").mangledNameHash());
+    ASSERT_EQ(0x0000059cu, ImmutableString("imageLoad(01M00D").mangledNameHash());
+    ASSERT_EQ(0x00000625u, ImmutableString("imageLoad(01N10D").mangledNameHash());
     ASSERT_EQ(0x0000028eu, ImmutableString("imageLoad(01O10D").mangledNameHash());
-    ASSERT_EQ(0x000006b0u, ImmutableString("imageLoad(01P10D").mangledNameHash());
+    ASSERT_EQ(0x000006b1u, ImmutableString("imageLoad(01P10D").mangledNameHash());
     ASSERT_EQ(0x00000159u, ImmutableString("imageLoad(01W10D").mangledNameHash());
     ASSERT_EQ(0x0000016du, ImmutableString("imageLoad(01X10D").mangledNameHash());
-    ASSERT_EQ(0x00000605u, ImmutableString("imageLoad(01Y10D").mangledNameHash());
-    ASSERT_EQ(0x000005a7u, ImmutableString("imageLoad(01Q10D00D").mangledNameHash());
-    ASSERT_EQ(0x000006e7u, ImmutableString("imageLoad(01R10D00D").mangledNameHash());
+    ASSERT_EQ(0x00000606u, ImmutableString("imageLoad(01Y10D").mangledNameHash());
+    ASSERT_EQ(0x000005a8u, ImmutableString("imageLoad(01Q10D00D").mangledNameHash());
+    ASSERT_EQ(0x000006e8u, ImmutableString("imageLoad(01R10D00D").mangledNameHash());
     ASSERT_EQ(0x000002efu, ImmutableString("imageLoad(01S10D00D").mangledNameHash());
     ASSERT_EQ(0x00000310u, ImmutableString("imageLoad(01T20D00D").mangledNameHash());
-    ASSERT_EQ(0x000006ccu, ImmutableString("imageLoad(01U20D00D").mangledNameHash());
+    ASSERT_EQ(0x000006cdu, ImmutableString("imageLoad(01U20D00D").mangledNameHash());
     ASSERT_EQ(0x000000b6u, ImmutableString("imageLoad(01V20D00D").mangledNameHash());
-    ASSERT_EQ(0x00000694u, ImmutableString("imageStore(00y10D30B").mangledNameHash());
+    ASSERT_EQ(0x00000695u, ImmutableString("imageStore(00y10D30B").mangledNameHash());
     ASSERT_EQ(0x0000009bu, ImmutableString("imageStore(00z10D30D").mangledNameHash());
     ASSERT_EQ(0x000000aau, ImmutableString("imageStore(01A10D30E").mangledNameHash());
-    ASSERT_EQ(0x000006afu, ImmutableString("imageStore(01B20D30B").mangledNameHash());
+    ASSERT_EQ(0x000006b0u, ImmutableString("imageStore(01B20D30B").mangledNameHash());
     ASSERT_EQ(0x000001b1u, ImmutableString("imageStore(01C20D30D").mangledNameHash());
     ASSERT_EQ(0x0000044bu, ImmutableString("imageStore(01D20D30E").mangledNameHash());
     ASSERT_EQ(0x000003dbu, ImmutableString("imageStore(01E20D30B").mangledNameHash());
     ASSERT_EQ(0x000004fbu, ImmutableString("imageStore(01F20D30D").mangledNameHash());
     ASSERT_EQ(0x000004b9u, ImmutableString("imageStore(01G20D30E").mangledNameHash());
-    ASSERT_EQ(0x000005e2u, ImmutableString("imageStore(01H20D30B").mangledNameHash());
+    ASSERT_EQ(0x000005e3u, ImmutableString("imageStore(01H20D30B").mangledNameHash());
     ASSERT_EQ(0x00000573u, ImmutableString("imageStore(01I20D30D").mangledNameHash());
     ASSERT_EQ(0x000000a0u, ImmutableString("imageStore(01J20D30E").mangledNameHash());
     ASSERT_EQ(0x000000d7u, ImmutableString("imageStore(01f00D30B").mangledNameHash());
@@ -2054,75 +2054,75 @@
     ASSERT_EQ(0x0000032fu, ImmutableString("imageStore(01h00D30E").mangledNameHash());
     ASSERT_EQ(0x00000531u, ImmutableString("imageStore(01Z20D30B").mangledNameHash());
     ASSERT_EQ(0x000002acu, ImmutableString("imageStore(01a20D30D").mangledNameHash());
-    ASSERT_EQ(0x0000072au, ImmutableString("imageStore(01b20D30E").mangledNameHash());
+    ASSERT_EQ(0x0000072bu, ImmutableString("imageStore(01b20D30E").mangledNameHash());
     ASSERT_EQ(0x0000002bu, ImmutableString("imageStore(01K00D30B").mangledNameHash());
     ASSERT_EQ(0x000000bcu, ImmutableString("imageStore(01L00D30D").mangledNameHash());
     ASSERT_EQ(0x00000176u, ImmutableString("imageStore(01M00D30E").mangledNameHash());
     ASSERT_EQ(0x00000197u, ImmutableString("imageStore(01N10D30B").mangledNameHash());
-    ASSERT_EQ(0x000007a2u, ImmutableString("imageStore(01O10D30D").mangledNameHash());
+    ASSERT_EQ(0x000007a3u, ImmutableString("imageStore(01O10D30D").mangledNameHash());
     ASSERT_EQ(0x000004f2u, ImmutableString("imageStore(01P10D30E").mangledNameHash());
     ASSERT_EQ(0x000001f1u, ImmutableString("imageStore(01W10D30B").mangledNameHash());
     ASSERT_EQ(0x000004bfu, ImmutableString("imageStore(01X10D30D").mangledNameHash());
     ASSERT_EQ(0x00000178u, ImmutableString("imageStore(01Y10D30E").mangledNameHash());
-    ASSERT_EQ(0x00000663u, ImmutableString("imageStore(01Q10D00D30B").mangledNameHash());
-    ASSERT_EQ(0x000005fcu, ImmutableString("imageStore(01R10D00D30D").mangledNameHash());
+    ASSERT_EQ(0x00000664u, ImmutableString("imageStore(01Q10D00D30B").mangledNameHash());
+    ASSERT_EQ(0x000005fdu, ImmutableString("imageStore(01R10D00D30D").mangledNameHash());
     ASSERT_EQ(0x00000417u, ImmutableString("imageStore(01S10D00D30E").mangledNameHash());
-    ASSERT_EQ(0x000007ebu, ImmutableString("imageStore(01T20D00D30B").mangledNameHash());
+    ASSERT_EQ(0x000007ecu, ImmutableString("imageStore(01T20D00D30B").mangledNameHash());
     ASSERT_EQ(0x00000120u, ImmutableString("imageStore(01U20D00D30D").mangledNameHash());
     ASSERT_EQ(0x00000297u, ImmutableString("imageStore(01V20D00D30E").mangledNameHash());
-    ASSERT_EQ(0x0000059au, ImmutableString("noise1(00B").mangledNameHash());
-    ASSERT_EQ(0x0000064fu, ImmutableString("noise1(10B").mangledNameHash());
-    ASSERT_EQ(0x000006e1u, ImmutableString("noise1(20B").mangledNameHash());
+    ASSERT_EQ(0x0000059bu, ImmutableString("noise1(00B").mangledNameHash());
+    ASSERT_EQ(0x00000650u, ImmutableString("noise1(10B").mangledNameHash());
+    ASSERT_EQ(0x000006e2u, ImmutableString("noise1(20B").mangledNameHash());
     ASSERT_EQ(0x00000320u, ImmutableString("noise1(30B").mangledNameHash());
     ASSERT_EQ(0x000002c6u, ImmutableString("noise2(00B").mangledNameHash());
     ASSERT_EQ(0x000000ccu, ImmutableString("noise2(10B").mangledNameHash());
     ASSERT_EQ(0x00000091u, ImmutableString("noise2(20B").mangledNameHash());
-    ASSERT_EQ(0x000006b9u, ImmutableString("noise2(30B").mangledNameHash());
+    ASSERT_EQ(0x000006bau, ImmutableString("noise2(30B").mangledNameHash());
     ASSERT_EQ(0x000002a5u, ImmutableString("noise3(00B").mangledNameHash());
     ASSERT_EQ(0x00000335u, ImmutableString("noise3(10B").mangledNameHash());
-    ASSERT_EQ(0x000006d8u, ImmutableString("noise3(20B").mangledNameHash());
+    ASSERT_EQ(0x000006d9u, ImmutableString("noise3(20B").mangledNameHash());
     ASSERT_EQ(0x000001f6u, ImmutableString("noise3(30B").mangledNameHash());
     ASSERT_EQ(0x0000032au, ImmutableString("noise4(00B").mangledNameHash());
     ASSERT_EQ(0x0000029du, ImmutableString("noise4(10B").mangledNameHash());
     ASSERT_EQ(0x00000478u, ImmutableString("noise4(20B").mangledNameHash());
     ASSERT_EQ(0x000003d8u, ImmutableString("noise4(30B").mangledNameHash());
     ASSERT_EQ(0x000001dcu, ImmutableString("memoryBarrier(").mangledNameHash());
-    ASSERT_EQ(0x0000069fu, ImmutableString("memoryBarrierAtomicCounter(").mangledNameHash());
+    ASSERT_EQ(0x000006a0u, ImmutableString("memoryBarrierAtomicCounter(").mangledNameHash());
     ASSERT_EQ(0x000000f9u, ImmutableString("memoryBarrierBuffer(").mangledNameHash());
-    ASSERT_EQ(0x0000082du, ImmutableString("memoryBarrierImage(").mangledNameHash());
-    ASSERT_EQ(0x000006ffu, ImmutableString("barrier(").mangledNameHash());
-    ASSERT_EQ(0x0000081bu, ImmutableString("memoryBarrierShared(").mangledNameHash());
+    ASSERT_EQ(0x0000082eu, ImmutableString("memoryBarrierImage(").mangledNameHash());
+    ASSERT_EQ(0x00000700u, ImmutableString("barrier(").mangledNameHash());
+    ASSERT_EQ(0x0000081cu, ImmutableString("memoryBarrierShared(").mangledNameHash());
     ASSERT_EQ(0x00000048u, ImmutableString("groupMemoryBarrier(").mangledNameHash());
     ASSERT_EQ(0x00000216u, ImmutableString("EmitVertex(").mangledNameHash());
     ASSERT_EQ(0x0000038cu, ImmutableString("EndPrimitive(").mangledNameHash());
     ASSERT_EQ(0x000003a8u, ImmutableString("EmitStreamVertex(00D").mangledNameHash());
     ASSERT_EQ(0x00000287u, ImmutableString("EndStreamPrimitive(00D").mangledNameHash());
-    ASSERT_EQ(0x000006ceu, ImmutableString("subpassLoad(01i").mangledNameHash());
-    ASSERT_EQ(0x000006eau, ImmutableString("subpassLoad(01j").mangledNameHash());
-    ASSERT_EQ(0x000006cfu, ImmutableString("subpassLoad(01k").mangledNameHash());
+    ASSERT_EQ(0x000006cfu, ImmutableString("subpassLoad(01i").mangledNameHash());
+    ASSERT_EQ(0x000006ebu, ImmutableString("subpassLoad(01j").mangledNameHash());
+    ASSERT_EQ(0x000006d0u, ImmutableString("subpassLoad(01k").mangledNameHash());
     ASSERT_EQ(0x00000196u, ImmutableString("subpassLoad(01l00D").mangledNameHash());
     ASSERT_EQ(0x00000299u, ImmutableString("subpassLoad(01m00D").mangledNameHash());
     ASSERT_EQ(0x00000564u, ImmutableString("subpassLoad(01n00D").mangledNameHash());
-    ASSERT_EQ(0x000006f7u, ImmutableString("anyInvocation(00F").mangledNameHash());
-    ASSERT_EQ(0x000005a4u, ImmutableString("allInvocations(00F").mangledNameHash());
+    ASSERT_EQ(0x000006f8u, ImmutableString("anyInvocation(00F").mangledNameHash());
+    ASSERT_EQ(0x000005a5u, ImmutableString("allInvocations(00F").mangledNameHash());
     ASSERT_EQ(0x000004b8u, ImmutableString("allInvocationsEqual(00F").mangledNameHash());
-    ASSERT_EQ(0x0000064cu, ImmutableString("gl_DepthRangeParameters").mangledNameHash());
+    ASSERT_EQ(0x0000064du, ImmutableString("gl_DepthRangeParameters").mangledNameHash());
     ASSERT_EQ(0x00000124u, ImmutableString("gl_DepthRange").mangledNameHash());
-    ASSERT_EQ(0x00000809u, ImmutableString("gl_MaxVertexAttribs").mangledNameHash());
+    ASSERT_EQ(0x0000080au, ImmutableString("gl_MaxVertexAttribs").mangledNameHash());
     ASSERT_EQ(0x000002ccu, ImmutableString("gl_MaxVertexUniformVectors").mangledNameHash());
     ASSERT_EQ(0x000001adu, ImmutableString("gl_MaxVertexTextureImageUnits").mangledNameHash());
     ASSERT_EQ(0x00000519u, ImmutableString("gl_MaxCombinedTextureImageUnits").mangledNameHash());
     ASSERT_EQ(0x000004e6u, ImmutableString("gl_MaxTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x000005edu, ImmutableString("gl_MaxFragmentUniformVectors").mangledNameHash());
-    ASSERT_EQ(0x00000621u, ImmutableString("gl_MaxVaryingVectors").mangledNameHash());
+    ASSERT_EQ(0x000005eeu, ImmutableString("gl_MaxFragmentUniformVectors").mangledNameHash());
+    ASSERT_EQ(0x00000622u, ImmutableString("gl_MaxVaryingVectors").mangledNameHash());
     ASSERT_EQ(0x000004cau, ImmutableString("gl_MaxDrawBuffers").mangledNameHash());
     ASSERT_EQ(0x0000017au, ImmutableString("gl_MaxDualSourceDrawBuffersEXT").mangledNameHash());
-    ASSERT_EQ(0x00000800u, ImmutableString("gl_MaxVertexOutputVectors").mangledNameHash());
+    ASSERT_EQ(0x00000801u, ImmutableString("gl_MaxVertexOutputVectors").mangledNameHash());
     ASSERT_EQ(0x0000005du, ImmutableString("gl_MaxFragmentInputVectors").mangledNameHash());
     ASSERT_EQ(0x00000528u, ImmutableString("gl_MinProgramTexelOffset").mangledNameHash());
-    ASSERT_EQ(0x00000791u, ImmutableString("gl_MaxProgramTexelOffset").mangledNameHash());
+    ASSERT_EQ(0x00000792u, ImmutableString("gl_MaxProgramTexelOffset").mangledNameHash());
     ASSERT_EQ(0x00000488u, ImmutableString("gl_MaxImageUnits").mangledNameHash());
-    ASSERT_EQ(0x000007e2u, ImmutableString("gl_MaxVertexImageUniforms").mangledNameHash());
+    ASSERT_EQ(0x000007e3u, ImmutableString("gl_MaxVertexImageUniforms").mangledNameHash());
     ASSERT_EQ(0x00000149u, ImmutableString("gl_MaxFragmentImageUniforms").mangledNameHash());
     ASSERT_EQ(0x00000232u, ImmutableString("gl_MaxComputeImageUniforms").mangledNameHash());
     ASSERT_EQ(0x00000543u, ImmutableString("gl_MaxCombinedImageUniforms").mangledNameHash());
@@ -2130,18 +2130,18 @@
               ImmutableString("gl_MaxCombinedShaderOutputResources").mangledNameHash());
     ASSERT_EQ(0x00000276u, ImmutableString("gl_MaxComputeWorkGroupCount").mangledNameHash());
     ASSERT_EQ(0x000004acu, ImmutableString("gl_MaxComputeWorkGroupSize").mangledNameHash());
-    ASSERT_EQ(0x00000698u, ImmutableString("gl_MaxComputeUniformComponents").mangledNameHash());
+    ASSERT_EQ(0x00000699u, ImmutableString("gl_MaxComputeUniformComponents").mangledNameHash());
     ASSERT_EQ(0x000000a3u, ImmutableString("gl_MaxComputeTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x00000649u, ImmutableString("gl_MaxComputeAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x0000064au, ImmutableString("gl_MaxComputeAtomicCounters").mangledNameHash());
     ASSERT_EQ(0x000001b7u, ImmutableString("gl_MaxComputeAtomicCounterBuffers").mangledNameHash());
     ASSERT_EQ(0x00000169u, ImmutableString("gl_MaxVertexAtomicCounters").mangledNameHash());
     ASSERT_EQ(0x00000186u, ImmutableString("gl_MaxFragmentAtomicCounters").mangledNameHash());
-    ASSERT_EQ(0x00000616u, ImmutableString("gl_MaxCombinedAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x00000617u, ImmutableString("gl_MaxCombinedAtomicCounters").mangledNameHash());
     ASSERT_EQ(0x00000022u, ImmutableString("gl_MaxAtomicCounterBindings").mangledNameHash());
     ASSERT_EQ(0x0000026au, ImmutableString("gl_MaxVertexAtomicCounterBuffers").mangledNameHash());
     ASSERT_EQ(0x00000328u, ImmutableString("gl_MaxFragmentAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x000007e4u, ImmutableString("gl_MaxCombinedAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x000007d3u, ImmutableString("gl_MaxAtomicCounterBufferSize").mangledNameHash());
+    ASSERT_EQ(0x000007e5u, ImmutableString("gl_MaxCombinedAtomicCounterBuffers").mangledNameHash());
+    ASSERT_EQ(0x000007d4u, ImmutableString("gl_MaxAtomicCounterBufferSize").mangledNameHash());
     ASSERT_EQ(0x0000046fu, ImmutableString("gl_MaxGeometryInputComponents").mangledNameHash());
     ASSERT_EQ(0x0000031fu, ImmutableString("gl_MaxGeometryOutputComponents").mangledNameHash());
     ASSERT_EQ(0x00000106u, ImmutableString("gl_MaxGeometryImageUniforms").mangledNameHash());
@@ -2150,38 +2150,39 @@
     ASSERT_EQ(0x0000052au,
               ImmutableString("gl_MaxGeometryTotalOutputComponents").mangledNameHash());
     ASSERT_EQ(0x000002d1u, ImmutableString("gl_MaxGeometryUniformComponents").mangledNameHash());
-    ASSERT_EQ(0x0000076bu, ImmutableString("gl_MaxGeometryAtomicCounters").mangledNameHash());
-    ASSERT_EQ(0x0000072fu, ImmutableString("gl_MaxGeometryAtomicCounterBuffers").mangledNameHash());
+    ASSERT_EQ(0x0000076cu, ImmutableString("gl_MaxGeometryAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x00000730u, ImmutableString("gl_MaxGeometryAtomicCounterBuffers").mangledNameHash());
     ASSERT_EQ(0x00000494u, ImmutableString("gl_FragCoord").mangledNameHash());
     ASSERT_EQ(0x000001b0u, ImmutableString("gl_FrontFacing").mangledNameHash());
     ASSERT_EQ(0x000004f5u, ImmutableString("gl_PointCoord").mangledNameHash());
     ASSERT_EQ(0x0000047eu, ImmutableString("gl_FragColor").mangledNameHash());
-    ASSERT_EQ(0x000007fcu, ImmutableString("gl_FragData").mangledNameHash());
+    ASSERT_EQ(0x000007fdu, ImmutableString("gl_FragData").mangledNameHash());
     ASSERT_EQ(0x000003d3u, ImmutableString("gl_FragDepth").mangledNameHash());
+    ASSERT_EQ(0x00000577u, ImmutableString("gl_HelperInvocation").mangledNameHash());
     ASSERT_EQ(0x000001c1u, ImmutableString("gl_SecondaryFragColorEXT").mangledNameHash());
-    ASSERT_EQ(0x0000074eu, ImmutableString("gl_SecondaryFragDataEXT").mangledNameHash());
+    ASSERT_EQ(0x0000074fu, ImmutableString("gl_SecondaryFragDataEXT").mangledNameHash());
     ASSERT_EQ(0x000002f5u, ImmutableString("gl_FragDepthEXT").mangledNameHash());
-    ASSERT_EQ(0x00000719u, ImmutableString("gl_LastFragData").mangledNameHash());
-    ASSERT_EQ(0x00000673u, ImmutableString("gl_LastFragColor").mangledNameHash());
+    ASSERT_EQ(0x0000071au, ImmutableString("gl_LastFragData").mangledNameHash());
+    ASSERT_EQ(0x00000674u, ImmutableString("gl_LastFragColor").mangledNameHash());
     ASSERT_EQ(0x000001bdu, ImmutableString("gl_LastFragColorARM").mangledNameHash());
-    ASSERT_EQ(0x00000669u, ImmutableString("gl_PrimitiveID").mangledNameHash());
-    ASSERT_EQ(0x0000066eu, ImmutableString("gl_Layer").mangledNameHash());
+    ASSERT_EQ(0x0000066au, ImmutableString("gl_PrimitiveID").mangledNameHash());
+    ASSERT_EQ(0x0000066fu, ImmutableString("gl_Layer").mangledNameHash());
     ASSERT_EQ(0x000003e6u, ImmutableString("gl_Position").mangledNameHash());
     ASSERT_EQ(0x00000209u, ImmutableString("gl_PointSize").mangledNameHash());
     ASSERT_EQ(0x00000114u, ImmutableString("gl_InstanceID").mangledNameHash());
     ASSERT_EQ(0x00000548u, ImmutableString("gl_VertexID").mangledNameHash());
     ASSERT_EQ(0x0000043eu, ImmutableString("gl_DrawID").mangledNameHash());
-    ASSERT_EQ(0x000007d6u, ImmutableString("gl_BaseVertex").mangledNameHash());
+    ASSERT_EQ(0x000007d7u, ImmutableString("gl_BaseVertex").mangledNameHash());
     ASSERT_EQ(0x000001c4u, ImmutableString("gl_BaseInstance").mangledNameHash());
     ASSERT_EQ(0x00000469u, ImmutableString("angle_BaseVertex").mangledNameHash());
     ASSERT_EQ(0x000003e3u, ImmutableString("angle_BaseInstance").mangledNameHash());
-    ASSERT_EQ(0x000005d2u, ImmutableString("gl_NumWorkGroups").mangledNameHash());
+    ASSERT_EQ(0x000005d3u, ImmutableString("gl_NumWorkGroups").mangledNameHash());
     ASSERT_EQ(0x0000034bu, ImmutableString("gl_WorkGroupSize").mangledNameHash());
-    ASSERT_EQ(0x00000764u, ImmutableString("gl_WorkGroupID").mangledNameHash());
-    ASSERT_EQ(0x0000072cu, ImmutableString("gl_LocalInvocationID").mangledNameHash());
+    ASSERT_EQ(0x00000765u, ImmutableString("gl_WorkGroupID").mangledNameHash());
+    ASSERT_EQ(0x0000072du, ImmutableString("gl_LocalInvocationID").mangledNameHash());
     ASSERT_EQ(0x00000547u, ImmutableString("gl_GlobalInvocationID").mangledNameHash());
-    ASSERT_EQ(0x000007dfu, ImmutableString("gl_LocalInvocationIndex").mangledNameHash());
-    ASSERT_EQ(0x000007bdu, ImmutableString("gl_PrimitiveIDIn").mangledNameHash());
+    ASSERT_EQ(0x000007e0u, ImmutableString("gl_LocalInvocationIndex").mangledNameHash());
+    ASSERT_EQ(0x000007beu, ImmutableString("gl_PrimitiveIDIn").mangledNameHash());
     ASSERT_EQ(0x000000c7u, ImmutableString("gl_InvocationID").mangledNameHash());
     ASSERT_EQ(0x00000348u, ImmutableString("gl_PerVertex").mangledNameHash());
     ASSERT_EQ(0x00000329u, ImmutableString("gl_in").mangledNameHash());
diff --git a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/QualificationOrder_test.cpp b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/QualificationOrder_test.cpp
index 98f8a2d..eccd0a6 100644
--- a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/QualificationOrder_test.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/QualificationOrder_test.cpp
@@ -429,7 +429,7 @@
         "}\n"
         "void main()\n"
         "{\n"
-        "    gl_FragColor = vec4(foo0(value));\n"
+        "   gl_FragColor = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -449,7 +449,7 @@
         "}\n"
         "void main()\n"
         "{\n"
-        "    gl_FragColor = vec4(foo0(value));\n"
+        "   gl_FragColor = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -469,7 +469,7 @@
         "}\n"
         "void main()\n"
         "{\n"
-        "    gl_FragColor = vec4(foo0(value));\n"
+        "   gl_FragColor = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -491,7 +491,7 @@
         "out vec4 colorOUT;\n"
         "void main()\n"
         "{\n"
-        "    colorOUT = vec4(foo0(value));\n"
+        "   colorOUT = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -513,7 +513,7 @@
         "out vec4 colorOUT;\n"
         "void main()\n"
         "{\n"
-        "    colorOUT = vec4(foo0(value));\n"
+        "   colorOUT = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
@@ -535,7 +535,7 @@
         "out vec4 colorOUT;\n"
         "void main()\n"
         "{\n"
-        "    colorOUT = vec4(foo0(value));\n"
+        "   colorOUT = vec4(foo0(value));\n"
         "}\n";
 
     if (compile(shaderString))
diff --git a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ShaderValidation_test.cpp b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ShaderValidation_test.cpp
index 5b72ef3..55879a2 100644
--- a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ShaderValidation_test.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ShaderValidation_test.cpp
@@ -1305,6 +1305,26 @@
     }
 }
 
+// Test that indexing a sampler array with a non-constant expression is forbidden, even if ANGLE is
+// able to constant fold the index expression. ESSL 3.00 section 4.1.7.1.
+TEST_F(FragmentShaderValidationTest, DynamicallyIndexedSampler)
+{
+    const std::string &shaderString =
+        "#version 300 es\n"
+        "precision mediump float;\n"
+        "uniform int a;\n"
+        "uniform sampler2D s[2];\n"
+        "out vec4 my_FragColor;\n"
+        "void main()\n"
+        "{\n"
+        "    my_FragColor = texture(s[true ? 0 : a], vec2(0));\n"
+        "}\n";
+    if (compile(shaderString))
+    {
+        FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
+    }
+}
+
 // Test that a shader that uses a struct definition in place of a struct constructor does not
 // compile. See GLSL ES 1.00 section 5.4.3.
 TEST_F(FragmentShaderValidationTest, StructConstructorWithStructDefinition)
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/BUILD.gn b/Source/ThirdParty/ANGLE/src/tests/deqp_support/BUILD.gn
new file mode 100644
index 0000000..22a4e28
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/BUILD.gn
@@ -0,0 +1,382 @@
+# GENERATED FILE - DO NOT EDIT.
+# Generated by: gen_vk_gl_cts_build.py
+#
+# 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.
+
+deqp_path = "../../../third_party/VK-GL-CTS/src"
+
+copy("vk_gl_cts_data_data_gles2_data") {
+  sources = [
+    "$deqp_path/data/gles2/data/brick.png",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles2/data/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_data_gles2_data_etc1") {
+  sources = [
+    "$deqp_path/data/gles2/data/etc1/photo_helsinki_113x89.pkm",
+    "$deqp_path/data/gles2/data/etc1/photo_helsinki_mip_0.pkm",
+    "$deqp_path/data/gles2/data/etc1/photo_helsinki_mip_1.pkm",
+    "$deqp_path/data/gles2/data/etc1/photo_helsinki_mip_2.pkm",
+    "$deqp_path/data/gles2/data/etc1/photo_helsinki_mip_3.pkm",
+    "$deqp_path/data/gles2/data/etc1/photo_helsinki_mip_4.pkm",
+    "$deqp_path/data/gles2/data/etc1/photo_helsinki_mip_5.pkm",
+    "$deqp_path/data/gles2/data/etc1/photo_helsinki_mip_6.pkm",
+    "$deqp_path/data/gles2/data/etc1/photo_helsinki_mip_7.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_61x61_neg_x.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_61x61_neg_y.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_61x61_neg_z.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_61x61_pos_x.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_61x61_pos_y.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_61x61_pos_z.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_x_mip_0.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_x_mip_1.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_x_mip_2.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_x_mip_3.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_x_mip_4.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_x_mip_5.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_x_mip_6.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_y_mip_0.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_y_mip_1.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_y_mip_2.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_y_mip_3.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_y_mip_4.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_y_mip_5.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_y_mip_6.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_z_mip_0.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_z_mip_1.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_z_mip_2.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_z_mip_3.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_z_mip_4.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_z_mip_5.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_neg_z_mip_6.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_x_mip_0.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_x_mip_1.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_x_mip_2.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_x_mip_3.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_x_mip_4.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_x_mip_5.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_x_mip_6.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_y_mip_0.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_y_mip_1.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_y_mip_2.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_y_mip_3.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_y_mip_4.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_y_mip_5.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_y_mip_6.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_z_mip_0.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_z_mip_1.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_z_mip_2.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_z_mip_3.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_z_mip_4.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_z_mip_5.pkm",
+    "$deqp_path/data/gles2/data/etc1/skybox_pos_z_mip_6.pkm",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_data_gles2_shaders") {
+  sources = [
+    "$deqp_path/data/gles2/shaders/conditionals.test",
+    "$deqp_path/data/gles2/shaders/constant_expressions.test",
+    "$deqp_path/data/gles2/shaders/constants.test",
+    "$deqp_path/data/gles2/shaders/conversions.test",
+    "$deqp_path/data/gles2/shaders/declarations.test",
+    "$deqp_path/data/gles2/shaders/fragdata.test",
+    "$deqp_path/data/gles2/shaders/functions.test",
+    "$deqp_path/data/gles2/shaders/invalid_constant_expressions.test",
+    "$deqp_path/data/gles2/shaders/invalid_implicit_conversions.test",
+    "$deqp_path/data/gles2/shaders/invalid_texture_functions.test",
+    "$deqp_path/data/gles2/shaders/keywords.test",
+    "$deqp_path/data/gles2/shaders/linkage.test",
+    "$deqp_path/data/gles2/shaders/loops.test",
+    "$deqp_path/data/gles2/shaders/misc.test",
+    "$deqp_path/data/gles2/shaders/preprocessor.test",
+    "$deqp_path/data/gles2/shaders/qualification_order.test",
+    "$deqp_path/data/gles2/shaders/reserved_operators.test",
+    "$deqp_path/data/gles2/shaders/scoping.test",
+    "$deqp_path/data/gles2/shaders/swizzles.test",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_data_gles3_data") {
+  sources = [
+    "$deqp_path/data/gles3/data/brick.png",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles3/data/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_data_gles3_data_etc1") {
+  sources = [
+    "$deqp_path/data/gles3/data/etc1/photo_helsinki_113x89.pkm",
+    "$deqp_path/data/gles3/data/etc1/photo_helsinki_mip_0.pkm",
+    "$deqp_path/data/gles3/data/etc1/photo_helsinki_mip_1.pkm",
+    "$deqp_path/data/gles3/data/etc1/photo_helsinki_mip_2.pkm",
+    "$deqp_path/data/gles3/data/etc1/photo_helsinki_mip_3.pkm",
+    "$deqp_path/data/gles3/data/etc1/photo_helsinki_mip_4.pkm",
+    "$deqp_path/data/gles3/data/etc1/photo_helsinki_mip_5.pkm",
+    "$deqp_path/data/gles3/data/etc1/photo_helsinki_mip_6.pkm",
+    "$deqp_path/data/gles3/data/etc1/photo_helsinki_mip_7.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_61x61_neg_x.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_61x61_neg_y.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_61x61_neg_z.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_61x61_pos_x.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_61x61_pos_y.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_61x61_pos_z.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_x_mip_0.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_x_mip_1.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_x_mip_2.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_x_mip_3.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_x_mip_4.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_x_mip_5.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_x_mip_6.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_y_mip_0.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_y_mip_1.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_y_mip_2.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_y_mip_3.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_y_mip_4.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_y_mip_5.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_y_mip_6.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_z_mip_0.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_z_mip_1.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_z_mip_2.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_z_mip_3.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_z_mip_4.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_z_mip_5.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_neg_z_mip_6.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_x_mip_0.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_x_mip_1.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_x_mip_2.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_x_mip_3.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_x_mip_4.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_x_mip_5.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_x_mip_6.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_y_mip_0.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_y_mip_1.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_y_mip_2.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_y_mip_3.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_y_mip_4.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_y_mip_5.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_y_mip_6.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_z_mip_0.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_z_mip_1.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_z_mip_2.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_z_mip_3.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_z_mip_4.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_z_mip_5.pkm",
+    "$deqp_path/data/gles3/data/etc1/skybox_pos_z_mip_6.pkm",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_data_gles3_shaders") {
+  sources = [
+    "$deqp_path/data/gles3/shaders/arrays.test",
+    "$deqp_path/data/gles3/shaders/conditionals.test",
+    "$deqp_path/data/gles3/shaders/constant_expressions.test",
+    "$deqp_path/data/gles3/shaders/constants.test",
+    "$deqp_path/data/gles3/shaders/conversions.test",
+    "$deqp_path/data/gles3/shaders/declarations.test",
+    "$deqp_path/data/gles3/shaders/fragdata.test",
+    "$deqp_path/data/gles3/shaders/functions.test",
+    "$deqp_path/data/gles3/shaders/indexing.test",
+    "$deqp_path/data/gles3/shaders/invalid_implicit_conversions.test",
+    "$deqp_path/data/gles3/shaders/invalid_texture_functions.test",
+    "$deqp_path/data/gles3/shaders/keywords.test",
+    "$deqp_path/data/gles3/shaders/large_constant_arrays.test",
+    "$deqp_path/data/gles3/shaders/linkage.test",
+    "$deqp_path/data/gles3/shaders/loops.test",
+    "$deqp_path/data/gles3/shaders/negative.test",
+    "$deqp_path/data/gles3/shaders/preprocessor.test",
+    "$deqp_path/data/gles3/shaders/qualification_order.test",
+    "$deqp_path/data/gles3/shaders/scoping.test",
+    "$deqp_path/data/gles3/shaders/switch.test",
+    "$deqp_path/data/gles3/shaders/swizzle_math_operations.test",
+    "$deqp_path/data/gles3/shaders/swizzles.test",
+    "$deqp_path/data/gles3/shaders/uniform_block.test",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_data_gles31_data_tessellation") {
+  sources = [
+    "$deqp_path/data/gles31/data/tessellation/barrier_ref.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_quads_equal_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_quads_equal_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_quads_equal_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_quads_fractional_even_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_quads_fractional_even_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_quads_fractional_even_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_quads_fractional_odd_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_quads_fractional_odd_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_quads_fractional_odd_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_triangles_equal_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_triangles_equal_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_triangles_equal_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_triangles_fractional_even_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_triangles_fractional_even_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_triangles_fractional_even_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_triangles_fractional_odd_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_triangles_fractional_odd_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_cover_triangles_fractional_odd_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_quads_equal_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_quads_equal_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_quads_equal_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_quads_fractional_even_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_quads_fractional_even_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_quads_fractional_even_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_quads_fractional_odd_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_quads_fractional_odd_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_quads_fractional_odd_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_triangles_equal_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_triangles_equal_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_triangles_equal_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_triangles_fractional_even_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_triangles_fractional_even_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_triangles_fractional_even_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_triangles_fractional_odd_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_triangles_fractional_odd_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/fill_overlap_triangles_fractional_odd_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/gl_position_ref.png",
+    "$deqp_path/data/gles31/data/tessellation/isolines_equal_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/isolines_equal_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/isolines_equal_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/isolines_fractional_even_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/isolines_fractional_even_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/isolines_fractional_even_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/isolines_fractional_odd_spacing_ref_0.png",
+    "$deqp_path/data/gles31/data/tessellation/isolines_fractional_odd_spacing_ref_1.png",
+    "$deqp_path/data/gles31/data/tessellation/isolines_fractional_odd_spacing_ref_2.png",
+    "$deqp_path/data/gles31/data/tessellation/patch_vertices_10_in_10_out_ref.png",
+    "$deqp_path/data/gles31/data/tessellation/patch_vertices_10_in_5_out_ref.png",
+    "$deqp_path/data/gles31/data/tessellation/patch_vertices_5_in_10_out_ref.png",
+    "$deqp_path/data/gles31/data/tessellation/primitive_id_tcs_ref.png",
+    "$deqp_path/data/gles31/data/tessellation/primitive_id_tes_ref.png",
+    "$deqp_path/data/gles31/data/tessellation/user_defined_io_isolines_ref.png",
+    "$deqp_path/data/gles31/data/tessellation/user_defined_io_quads_ref.png",
+    "$deqp_path/data/gles31/data/tessellation/user_defined_io_triangles_ref.png",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_data_gles31_shaders_es31") {
+  sources = [
+    "$deqp_path/data/gles31/shaders/es31/android_extension_pack.test",
+    "$deqp_path/data/gles31/shaders/es31/arrays.test",
+    "$deqp_path/data/gles31/shaders/es31/arrays_of_arrays.test",
+    "$deqp_path/data/gles31/shaders/es31/declarations.test",
+    "$deqp_path/data/gles31/shaders/es31/functions.test",
+    "$deqp_path/data/gles31/shaders/es31/implicit_conversions.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_geometry.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_geometry_uniform_types.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_geometry_varying_types.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_io_block.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_shader_storage_block.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_tessellation.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_tessellation_geometry.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_tessellation_geometry_varying_types.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_tessellation_uniform_types.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_tessellation_varying_types.test",
+    "$deqp_path/data/gles31/shaders/es31/linkage_uniform.test",
+    "$deqp_path/data/gles31/shaders/es31/separate_shader_validation.test",
+    "$deqp_path/data/gles31/shaders/es31/tessellation_negative_user_defined_io.test",
+    "$deqp_path/data/gles31/shaders/es31/uniform_block.test",
+    "$deqp_path/data/gles31/shaders/es31/uniform_location.test",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_data_gles31_shaders_es32") {
+  sources = [
+    "$deqp_path/data/gles31/shaders/es32/android_extension_pack.test",
+    "$deqp_path/data/gles31/shaders/es32/arrays.test",
+    "$deqp_path/data/gles31/shaders/es32/arrays_of_arrays.test",
+    "$deqp_path/data/gles31/shaders/es32/functions.test",
+    "$deqp_path/data/gles31/shaders/es32/implicit_conversions.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_geometry.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_geometry_uniform_types.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_geometry_varying_types.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_io_block.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_shader_storage_block.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_tessellation.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_tessellation_geometry.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_tessellation_geometry_varying_types.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_tessellation_uniform_types.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_tessellation_varying_types.test",
+    "$deqp_path/data/gles31/shaders/es32/linkage_uniform.test",
+    "$deqp_path/data/gles31/shaders/es32/separate_shader_validation.test",
+    "$deqp_path/data/gles31/shaders/es32/tessellation_negative_user_defined_io.test",
+    "$deqp_path/data/gles31/shaders/es32/uniform_block.test",
+    "$deqp_path/data/gles31/shaders/es32/uniform_location.test",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_external_graphicsfuzz_data_gles3_graphicsfuzz") {
+  sources = [
+    "$deqp_path/external/graphicsfuzz/data/gles3/graphicsfuzz/vertexShader.glsl",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/{{source_file_part}}",
+  ]
+}
+
+copy(
+    "vk_gl_cts_data_external_graphicsfuzz_data_gles3_graphicsfuzz_bubblesort_flag") {
+  sources = [
+    "$deqp_path/external/graphicsfuzz/data/gles3/graphicsfuzz/bubblesort_flag/recipient.frag",
+    "$deqp_path/external/graphicsfuzz/data/gles3/graphicsfuzz/bubblesort_flag/variant_1.frag",
+    "$deqp_path/external/graphicsfuzz/data/gles3/graphicsfuzz/bubblesort_flag/variant_2.frag",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/bubblesort_flag/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_external_graphicsfuzz_data_gles3_graphicsfuzz_synthetic") {
+  sources = [
+    "$deqp_path/external/graphicsfuzz/data/gles3/graphicsfuzz/synthetic/recipient.frag",
+    "$deqp_path/external/graphicsfuzz/data/gles3/graphicsfuzz/synthetic/variant_1.frag",
+    "$deqp_path/external/graphicsfuzz/data/gles3/graphicsfuzz/synthetic/variant_2.frag",
+    "$deqp_path/external/graphicsfuzz/data/gles3/graphicsfuzz/synthetic/variant_3.frag",
+    "$deqp_path/external/graphicsfuzz/data/gles3/graphicsfuzz/synthetic/variant_4.frag",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/{{source_file_part}}",
+  ]
+}
+
+copy("vk_gl_cts_data_external_openglcts_data_gles3") {
+  sources = [
+    "$deqp_path/external/openglcts/data/gles3/arrays.test",
+    "$deqp_path/external/openglcts/data/gles3/declarations.test",
+    "$deqp_path/external/openglcts/data/gles3/literal_parsing.test",
+    "$deqp_path/external/openglcts/data/gles3/name_hiding.test",
+    "$deqp_path/external/openglcts/data/gles3/preprocessor.test",
+    "$deqp_path/external/openglcts/data/gles3/switch.test",
+  ]
+  outputs = [
+    "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/{{source_file_part}}",
+  ]
+}
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/angle_deqp_gtest.cpp b/Source/ThirdParty/ANGLE/src/tests/deqp_support/angle_deqp_gtest.cpp
index e6e65ef..05db50b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/angle_deqp_gtest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/angle_deqp_gtest.cpp
@@ -58,9 +58,9 @@
 }
 
 const char *gCaseListSearchPaths[] = {
-    "/../../sdcard/chromium_tests_root/third_party/angle/third_party/deqp/src",
-    "/../../third_party/deqp/src",
-    "/../../third_party/angle/third_party/deqp/src",
+    "/../../sdcard/chromium_tests_root/third_party/angle/third_party/VK-GL-CTS/src",
+    "/../../third_party/VK-GL-CTS/src",
+    "/../../third_party/angle/third_party/VK-GL-CTS/src",
 };
 
 const char *gTestExpectationsSearchPaths[] = {
@@ -268,6 +268,19 @@
 
     GPUTestConfig testConfig = GPUTestConfig(api);
 
+#if !defined(ANGLE_PLATFORM_ANDROID)
+    // Note: These prints mess up parsing of test list when running on Android.
+    std::cout << "Using test config with:" << std::endl;
+    for (uint32_t condition : testConfig.getConditions())
+    {
+        const char *name = GetConditionName(condition);
+        if (name != nullptr)
+        {
+            std::cout << "  " << name << std::endl;
+        }
+    }
+#endif
+
     if (!mTestExpectationsParser.loadTestExpectationsFromFile(testConfig,
                                                               testExpectationsPath.value()))
     {
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/angle_deqp_libtester_main.cpp b/Source/ThirdParty/ANGLE/src/tests/deqp_support/angle_deqp_libtester_main.cpp
index ea9f09b..6d7a8ed 100644
--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/angle_deqp_libtester_main.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/angle_deqp_libtester_main.cpp
@@ -38,10 +38,10 @@
 const char *kDataPaths[] = {
     ".",
     "../../sdcard/chromium_tests_root",
-    "../../sdcard/chromium_tests_root/third_party/angle/third_party/deqp/src",
-    "../../third_party/angle/third_party/deqp/src",
-    "../../third_party/deqp/src",
-    "third_party/deqp/src",
+    "../../sdcard/chromium_tests_root/third_party/angle/third_party/VK-GL-CTS/src",
+    "../../third_party/angle/third_party/VK-GL-CTS/src",
+    "../../third_party/VK-GL-CTS/src",
+    "third_party/VK-GL-CTS/src",
 };
 
 bool FindDataDir(std::string *dataDirOut)
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp.gni b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp.gni
similarity index 98%
rename from Source/ThirdParty/ANGLE/src/tests/deqp.gni
rename to Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp.gni
index e993b75..2a7f9ca 100644
--- a/Source/ThirdParty/ANGLE/src/tests/deqp.gni
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp.gni
@@ -2,7 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-deqp_path = "../../third_party/deqp/src"
+import("../../../gni/angle.gni")
+deqp_path = "../../third_party/VK-GL-CTS/src"
 
 deqp_include_dirs = [
   "$deqp_path/executor",
@@ -24,6 +25,8 @@
   "$deqp_path/modules/gles31/functional",
   "$deqp_path/modules/gles31/stress",
   "$deqp_path/modules/glusecases",
+  "${angle_glslang_dir}",
+  "${angle_spirv_tools_dir}",
 ]
 
 deqp_gles2_sources = [
@@ -49,6 +52,8 @@
   "$deqp_path/modules/gles2/functional/es2fBufferTestUtil.hpp",
   "$deqp_path/modules/gles2/functional/es2fBufferWriteTests.cpp",
   "$deqp_path/modules/gles2/functional/es2fBufferWriteTests.hpp",
+  "$deqp_path/modules/gles2/functional/es2fClipControlTests.cpp",
+  "$deqp_path/modules/gles2/functional/es2fClipControlTests.hpp",
   "$deqp_path/modules/gles2/functional/es2fClippingTests.cpp",
   "$deqp_path/modules/gles2/functional/es2fClippingTests.hpp",
   "$deqp_path/modules/gles2/functional/es2fColorClearTest.cpp",
@@ -905,7 +910,11 @@
   "$deqp_path/external/openglcts/modules/common/glcSampleVariablesTests.hpp",
   "$deqp_path/external/openglcts/modules/common/glcSeparableProgramsTransformFeedbackTests.cpp",
   "$deqp_path/external/openglcts/modules/common/glcSeparableProgramsTransformFeedbackTests.hpp",
-  "$deqp_path/external/openglcts/modules/common/glcShaderConstExprTests.cpp",
+
+  # Override to work around a dEQP bug: https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/1859
+  # "$deqp_path/external/openglcts/modules/common/glcShaderConstExprTests.cpp",
+  "deqp_support/glcShaderConstExprTests_override.cpp",
+
   "$deqp_path/external/openglcts/modules/common/glcShaderConstExprTests.hpp",
   "$deqp_path/external/openglcts/modules/common/glcShaderGroupVoteTests.cpp",
   "$deqp_path/external/openglcts/modules/common/glcShaderGroupVoteTests.hpp",
@@ -919,7 +928,11 @@
   "$deqp_path/external/openglcts/modules/common/glcShaderLibraryCase.hpp",
   "$deqp_path/external/openglcts/modules/common/glcShaderLoopTests.cpp",
   "$deqp_path/external/openglcts/modules/common/glcShaderLoopTests.hpp",
-  "$deqp_path/external/openglcts/modules/common/glcShaderMacroTests.cpp",
+
+  # Override to work around a dEQP bug: https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/1859
+  # "$deqp_path/external/openglcts/modules/common/glcShaderMacroTests.cpp",
+  "deqp_support/glcShaderMacroTests_override.cpp",
+
   "$deqp_path/external/openglcts/modules/common/glcShaderMacroTests.hpp",
   "$deqp_path/external/openglcts/modules/common/glcShaderMultisampleInterpolationTests.cpp",
   "$deqp_path/external/openglcts/modules/common/glcShaderMultisampleInterpolationTests.hpp",
@@ -976,6 +989,7 @@
   "$deqp_path/external/openglcts/modules/glesext/texture_border_clamp/esextcTextureBorderClampTests.hpp",
   "$deqp_path/external/openglcts/modules/glesext/texture_buffer/esextcTextureBufferTests.hpp",
   "$deqp_path/external/openglcts/modules/glesext/texture_cube_map_array/esextcTextureCubeMapArrayTests.hpp",
+  "$deqp_path/external/openglcts/modules/glesext/texture_shadow_lod/esextcTextureShadowLodFunctionsTest.hpp",
   "$deqp_path/external/openglcts/modules/glesext/draw_buffers_indexed/esextcDrawBuffersIndexedTests.hpp",
   "$deqp_path/modules/gles2/tes2Context.hpp",
   "$deqp_path/modules/gles2/tes2TestPackage.hpp",
@@ -1365,6 +1379,7 @@
   "$deqp_path/external/openglcts/modules/glesext/texture_cube_map_array/esextcTextureCubeMapArrayTests.cpp",
   "$deqp_path/external/openglcts/modules/glesext/texture_cube_map_array/esextcTextureCubeMapArrayTex3DValidation.cpp",
   "$deqp_path/external/openglcts/modules/glesext/texture_cube_map_array/esextcTextureCubeMapArrayTex3DValidation.hpp",
+  "$deqp_path/external/openglcts/modules/glesext/texture_shadow_lod/esextcTextureShadowLodFunctionsTest.cpp",
 ]
 
 deqp_framework_debase_sources = [
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_data_autogen.gni b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_data_autogen.gni
new file mode 100644
index 0000000..d63cabc
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_data_autogen.gni
@@ -0,0 +1,323 @@
+# GENERATED FILE - DO NOT EDIT.
+# Generated by: gen_vk_gl_cts_build.py
+#
+# 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.
+
+import("deqp.gni")
+
+angle_deqp_data_gles2 = [
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/brick.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/photo_helsinki_113x89.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/photo_helsinki_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/photo_helsinki_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/photo_helsinki_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/photo_helsinki_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/photo_helsinki_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/photo_helsinki_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/photo_helsinki_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/photo_helsinki_mip_7.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_61x61_neg_x.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_61x61_neg_y.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_61x61_neg_z.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_61x61_pos_x.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_61x61_pos_y.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_61x61_pos_z.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_x_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_x_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_x_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_x_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_x_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_x_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_x_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_y_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_y_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_y_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_y_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_y_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_y_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_y_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_z_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_z_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_z_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_z_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_z_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_z_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_neg_z_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_x_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_x_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_x_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_x_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_x_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_x_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_x_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_y_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_y_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_y_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_y_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_y_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_y_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_y_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_z_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_z_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_z_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_z_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_z_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_z_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/data/etc1/skybox_pos_z_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/conditionals.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/constant_expressions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/constants.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/conversions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/declarations.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/fragdata.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/functions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/invalid_constant_expressions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/invalid_implicit_conversions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/invalid_texture_functions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/keywords.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/linkage.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/loops.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/misc.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/preprocessor.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/qualification_order.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/reserved_operators.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/scoping.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/swizzles.test",
+]
+
+angle_deqp_data_gles3 = [
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/brick.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/photo_helsinki_113x89.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/photo_helsinki_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/photo_helsinki_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/photo_helsinki_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/photo_helsinki_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/photo_helsinki_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/photo_helsinki_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/photo_helsinki_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/photo_helsinki_mip_7.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_61x61_neg_x.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_61x61_neg_y.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_61x61_neg_z.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_61x61_pos_x.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_61x61_pos_y.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_61x61_pos_z.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_x_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_x_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_x_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_x_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_x_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_x_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_x_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_y_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_y_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_y_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_y_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_y_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_y_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_y_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_z_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_z_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_z_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_z_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_z_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_z_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_neg_z_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_x_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_x_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_x_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_x_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_x_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_x_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_x_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_y_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_y_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_y_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_y_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_y_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_y_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_y_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_z_mip_0.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_z_mip_1.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_z_mip_2.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_z_mip_3.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_z_mip_4.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_z_mip_5.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/data/etc1/skybox_pos_z_mip_6.pkm",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/arrays.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/conditionals.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/constant_expressions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/constants.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/conversions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/declarations.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/fragdata.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/functions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/indexing.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/invalid_implicit_conversions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/invalid_texture_functions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/keywords.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/large_constant_arrays.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/linkage.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/loops.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/negative.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/preprocessor.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/qualification_order.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/scoping.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/switch.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/swizzle_math_operations.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/swizzles.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/shaders/uniform_block.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/bubblesort_flag/recipient.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/bubblesort_flag/variant_1.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/bubblesort_flag/variant_2.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/recipient.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/variant_1.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/variant_2.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/variant_3.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/variant_4.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/vertexShader.glsl",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/arrays.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/declarations.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/literal_parsing.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/name_hiding.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/preprocessor.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/switch.test",
+]
+
+angle_deqp_data_gles31 = [
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/barrier_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_quads_equal_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_quads_equal_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_quads_equal_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_quads_fractional_even_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_quads_fractional_even_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_quads_fractional_even_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_quads_fractional_odd_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_quads_fractional_odd_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_quads_fractional_odd_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_triangles_equal_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_triangles_equal_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_triangles_equal_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_triangles_fractional_even_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_triangles_fractional_even_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_triangles_fractional_even_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_triangles_fractional_odd_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_triangles_fractional_odd_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_cover_triangles_fractional_odd_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_quads_equal_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_quads_equal_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_quads_equal_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_quads_fractional_even_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_quads_fractional_even_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_quads_fractional_even_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_quads_fractional_odd_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_quads_fractional_odd_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_quads_fractional_odd_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_triangles_equal_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_triangles_equal_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_triangles_equal_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_triangles_fractional_even_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_triangles_fractional_even_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_triangles_fractional_even_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_triangles_fractional_odd_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_triangles_fractional_odd_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/fill_overlap_triangles_fractional_odd_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/gl_position_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/isolines_equal_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/isolines_equal_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/isolines_equal_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/isolines_fractional_even_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/isolines_fractional_even_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/isolines_fractional_even_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/isolines_fractional_odd_spacing_ref_0.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/isolines_fractional_odd_spacing_ref_1.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/isolines_fractional_odd_spacing_ref_2.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/patch_vertices_10_in_10_out_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/patch_vertices_10_in_5_out_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/patch_vertices_5_in_10_out_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/primitive_id_tcs_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/primitive_id_tes_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/user_defined_io_isolines_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/user_defined_io_quads_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/data/tessellation/user_defined_io_triangles_ref.png",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/android_extension_pack.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/arrays.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/arrays_of_arrays.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/declarations.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/functions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/implicit_conversions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_geometry.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_geometry_uniform_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_geometry_varying_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_io_block.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_shader_storage_block.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_tessellation.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_tessellation_geometry.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_tessellation_geometry_varying_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_tessellation_uniform_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_tessellation_varying_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/linkage_uniform.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/separate_shader_validation.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/tessellation_negative_user_defined_io.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/uniform_block.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es31/uniform_location.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/android_extension_pack.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/arrays.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/arrays_of_arrays.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/functions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/implicit_conversions.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_geometry.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_geometry_uniform_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_geometry_varying_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_io_block.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_shader_storage_block.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_tessellation.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_tessellation_geometry.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_tessellation_geometry_varying_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_tessellation_uniform_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_tessellation_varying_types.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/linkage_uniform.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/separate_shader_validation.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/tessellation_negative_user_defined_io.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/uniform_block.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gles31/shaders/es32/uniform_location.test",
+]
+
+angle_deqp_external_graphicsfuzz_data_gles3 = [
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/bubblesort_flag/recipient.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/bubblesort_flag/variant_1.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/bubblesort_flag/variant_2.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/recipient.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/variant_1.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/variant_2.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/variant_3.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/synthetic/variant_4.frag",
+  "$root_gen_dir/vk_gl_cts_data/data/gles3/graphicsfuzz/vertexShader.glsl",
+]
+
+angle_deqp_external_openglcts_data_gles3 = [
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/arrays.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/declarations.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/literal_parsing.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/name_hiding.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/preprocessor.test",
+  "$root_gen_dir/vk_gl_cts_data/data/gl_cts/data/gles3/switch.test",
+]
+
+angle_deqp_data_copy_targets = [
+  "deqp_support:vk_gl_cts_data_data_gles2_data",
+  "deqp_support:vk_gl_cts_data_data_gles2_data_etc1",
+  "deqp_support:vk_gl_cts_data_data_gles2_shaders",
+  "deqp_support:vk_gl_cts_data_data_gles3_data",
+  "deqp_support:vk_gl_cts_data_data_gles3_data_etc1",
+  "deqp_support:vk_gl_cts_data_data_gles3_shaders",
+  "deqp_support:vk_gl_cts_data_data_gles31_data_tessellation",
+  "deqp_support:vk_gl_cts_data_data_gles31_shaders_es31",
+  "deqp_support:vk_gl_cts_data_data_gles31_shaders_es32",
+  "deqp_support:vk_gl_cts_data_external_graphicsfuzz_data_gles3_graphicsfuzz",
+  "deqp_support:vk_gl_cts_data_external_graphicsfuzz_data_gles3_graphicsfuzz_bubblesort_flag",
+  "deqp_support:vk_gl_cts_data_external_graphicsfuzz_data_gles3_graphicsfuzz_synthetic",
+  "deqp_support:vk_gl_cts_data_external_openglcts_data_gles3",
+]
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_egl_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_egl_TestExpectations
new file mode 100644
index 0000000..eaed281
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_egl_TestExpectations
@@ -0,0 +1,251 @@
+// Copyright 2015 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.
+
+// This file contains a list of defective dEQP conformance tests. The expected
+// format is:
+//  {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP}
+//
+// MODIFIERS can be a combination of the below list, combined with a logical AND:
+//  WIN XP VISTA WIN7 WIN8 WIN10
+//  MAC LEOPARD SNOWLEOPARD LION MOUNTAINLION MAVERICKS YOSEMITE ELCAPITAN SIERRA HIGHSIERRA MOJAVE
+//  LINUX CHROMEOS ANDROID
+//  NVIDIA AMD INTEL
+//  DEBUG RELEASE
+//  D3D9 D3D11 OPENGL GLES VULKAN
+//  NEXUS5X PIXEL2ORXL
+//  QUADROP400
+//
+//
+// TEST_NAME can be a specific test name, or have a '*' in the end, which
+// indicates a prefix matching.
+//
+// Examples:
+// fails on both windows and mac (crash)
+//  91530 WIN : context_lost_restored = SKIP
+//  91530 MAC : context_lost_restored = SKIP
+// fails on windows using NVIDIA GPUs
+//  91533 WIN NVIDIA : gl_min_uniforms = FAIL
+// fails on Nexus5X with GLES backend (hangs)
+//  91531 NEXUS5X GLES : conformance_more_* = SKIP
+
+// Only Vulkan supports multithreading
+3916 OPENGL : dEQP-EGL.functional.sharing.gles2.multithread.* = SKIP
+3916 OPENGL : dEQP-EGL.functional.multithread.* = SKIP
+3916 OPENGL : dEQP-EGL.functional.render.multi_thread.* = SKIP
+3916 OPENGL : dEQP-EGL.functional.color_clears.multi_thread.* = SKIP
+3916 GLES : dEQP-EGL.functional.sharing.gles2.multithread.* = SKIP
+3916 GLES : dEQP-EGL.functional.multithread.* = SKIP
+3916 GLES : dEQP-EGL.functional.render.multi_thread.* = SKIP
+3916 GLES : dEQP-EGL.functional.color_clears.multi_thread.* = SKIP
+3916 D3D11 : dEQP-EGL.functional.sharing.gles2.multithread.* = SKIP
+3916 D3D11 : dEQP-EGL.functional.multithread.* = SKIP
+3916 D3D11 : dEQP-EGL.functional.render.multi_thread.* = SKIP
+3916 D3D11 : dEQP-EGL.functional.color_clears.multi_thread.* = SKIP
+3916 D3D9 : dEQP-EGL.functional.sharing.gles2.multithread.* = SKIP
+3916 D3D9 : dEQP-EGL.functional.multithread.* = SKIP
+3916 D3D9 : dEQP-EGL.functional.render.multi_thread.* = SKIP
+3916 D3D9 : dEQP-EGL.functional.color_clears.multi_thread.* = SKIP
+
+// Seems to time out on Linux.
+4031916 VULKAN : dEQP-EGL.functional.multithread.* = SKIP
+
+// These tests require pixmap surfaces. On many platforms they are unsupported.
+3917 ANDROID VULKAN : dEQP-EGL.functional.render.multi_thread.* = FAIL
+3917 ANDROID VULKAN : dEQP-EGL.functional.color_clears.multi_thread.* = FAIL
+
+// dEQP doesn't handle configs created for extensions
+1662 WIN : dEQP-EGL.functional.color_clears.single_context.gles2.other = FAIL
+1662 WIN : dEQP-EGL.functional.color_clears.single_context.gles3.other = FAIL
+1662 WIN : dEQP-EGL.functional.color_clears.multi_context.gles2.other = FAIL
+1662 WIN : dEQP-EGL.functional.color_clears.multi_context.gles3.other = FAIL
+1662 WIN : dEQP-EGL.functional.render.single_context.gles2.other = FAIL
+1662 WIN : dEQP-EGL.functional.render.single_context.gles3.other = FAIL
+1662 WIN : dEQP-EGL.functional.render.multi_context.gles2.other = FAIL
+1662 WIN : dEQP-EGL.functional.render.multi_context.gles3.other = FAIL
+1662 WIN : dEQP-EGL.functional.render.multi_context.gles2_gles3.other = FAIL
+1662 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.other_clear = FAIL
+1662 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.other_render = FAIL
+1662 WIN : dEQP-EGL.functional.query_context.get_current_context.other = FAIL
+1662 WIN : dEQP-EGL.functional.query_context.get_current_surface.other = FAIL
+1662 WIN : dEQP-EGL.functional.query_context.get_current_display.other = FAIL
+1662 WIN : dEQP-EGL.functional.query_context.query_context.other = FAIL
+1662 WIN : dEQP-EGL.functional.native_color_mapping.native_window.other_clear = SKIP
+1662 WIN : dEQP-EGL.functional.native_color_mapping.native_window.other_render = SKIP
+
+// Intentionally causes TDRs that eventually blacklist the application
+2319 : dEQP-EGL.functional.robustness.reset_context.shaders.infinite_loop.* = SKIP
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Temprory entries: they should be removed once the bugs are fixed.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Flaky since we enabled depth/stencil backbuffer in all tests.
+2429 WIN NVIDIA : dEQP-EGL.functional.query_context.query_context.rgba8888_window = FAIL
+
+// TODO(jmadill): Triage these into permananent and temporary failures.
+1340 WIN : dEQP-EGL.functional.query_config.get_configs.get_configs_bounds = FAIL
+3270 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.config_id = FAIL
+3270 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.config_id = FAIL
+1340 WIN : dEQP-EGL.functional.render.single_context.gles2.rgba5551_window = FAIL
+1340 WIN : dEQP-EGL.functional.render.single_context.gles2.rgba5551_pbuffer = FAIL
+1340 WIN : dEQP-EGL.functional.render.single_context.gles3.rgba5551_window = FAIL
+1340 WIN : dEQP-EGL.functional.render.single_context.gles3.rgba5551_pbuffer = FAIL
+1340 WIN : dEQP-EGL.functional.render.multi_context.gles2.rgba5551_window = FAIL
+1340 WIN : dEQP-EGL.functional.render.multi_context.gles2.rgba5551_pbuffer = FAIL
+1340 WIN : dEQP-EGL.functional.render.multi_context.gles3.rgba5551_window = FAIL
+1340 WIN : dEQP-EGL.functional.render.multi_context.gles3.rgba5551_pbuffer = FAIL
+1340 WIN : dEQP-EGL.functional.render.multi_context.gles2_gles3.rgba5551_window = FAIL
+1340 WIN : dEQP-EGL.functional.render.multi_context.gles2_gles3.rgba5551_pbuffer = FAIL
+1340 WIN : dEQP-EGL.functional.negative_api.choose_config = SKIP
+1340 WIN : dEQP-EGL.functional.negative_api.surface_attrib = SKIP
+1340 WIN : dEQP-EGL.functional.negative_api.swap_interval = FAIL
+2382 WIN : dEQP-EGL.functional.native_color_mapping.native_window.* = SKIP
+1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.* = FAIL
+2716 WIN : dEQP-EGL.functional.preserve_swap.preserve.no_read_before_swap.* = SKIP
+2716 WIN : dEQP-EGL.functional.preserve_swap.preserve.read_before_swap.* = SKIP
+1340 WIN : dEQP-EGL.functional.resize.back_buffer.* = SKIP
+1340 WIN : dEQP-EGL.functional.resize.pixel_density.* = SKIP
+
+// Windows OpenGL failures
+2546 WIN : dEQP-EGL.functional.resize.surface_size.shrink = SKIP
+2546 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba8888_depth_stencil = FAIL
+2546 WIN : dEQP-EGL.functional.thread_cleanup.* = SKIP
+
+// Windows Vulkan failures
+2635 WIN VULKAN : dEQP-EGL.functional.multicontext.non_shared_clear = FAIL
+2635 WIN VULKAN : dEQP-EGL.functional.multicontext.non_shared_make_current = FAIL
+2635 WIN VULKAN : dEQP-EGL.functional.multicontext.shared_clear = FAIL
+2635 WIN VULKAN : dEQP-EGL.functional.multicontext.shared_make_current = FAIL
+2635 WIN VULKAN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba8888_depth_stencil = FAIL
+2635 WIN VULKAN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba8888_no_depth_no_stencil = FAIL
+2715 WIN VULKAN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb888_depth_no_stencil = FAIL
+2715 WIN VULKAN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb888_depth_stencil = FAIL
+2715 WIN VULKAN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb888_no_depth_no_stencil = FAIL
+2715 WIN VULKAN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba8888_depth_no_stencil = FAIL
+2715 WIN VULKAN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba8888_no_depth_no_stencil = FAIL
+2635 WIN VULKAN : dEQP-EGL.functional.resize.surface_size.grow = FAIL
+2635 WIN VULKAN : dEQP-EGL.functional.resize.surface_size.stretch_height = FAIL
+2635 WIN VULKAN : dEQP-EGL.functional.resize.surface_size.stretch_width = FAIL
+2635 WIN VULKAN : dEQP-EGL.functional.wide_color.pbuffer_8888_colorspace_default = FAIL
+2716 WIN VULKAN : dEQP-EGL.functional.preserve_swap.no_preserve.* = FAIL
+
+// Linux failures
+2546 LINUX : dEQP-EGL.functional.color_clears.multi_context.gles1.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.color_clears.multi_context.gles1_gles2.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.color_clears.multi_context.gles1_gles2_gles3.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.color_clears.multi_context.gles2.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.color_clears.multi_context.gles3.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.color_clears.single_context.gles1.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.color_clears.single_context.gles2.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.color_clears.single_context.gles3.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.create_surface.pixmap.rgba8888_depth_stencil = SKIP
+2546 LINUX : dEQP-EGL.functional.create_surface.pixmap.rgba8888_no_depth_no_stencil = SKIP
+2546 LINUX : dEQP-EGL.functional.negative_api.copy_buffers = SKIP
+2546 LINUX : dEQP-EGL.functional.query_context.get_current_context.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.query_context.get_current_display.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.query_context.get_current_surface.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.query_context.query_context.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.query_surface.set_attribute.pixmap.rgba8888_depth_stencil = SKIP
+2546 LINUX : dEQP-EGL.functional.query_surface.set_attribute.pixmap.rgba8888_no_depth_no_stencil = SKIP
+2546 LINUX : dEQP-EGL.functional.query_surface.simple.pixmap.rgba8888_depth_stencil = SKIP
+2546 LINUX : dEQP-EGL.functional.query_surface.simple.pixmap.rgba8888_no_depth_no_stencil = SKIP
+2546 LINUX : dEQP-EGL.functional.render.multi_context.* = SKIP
+2546 LINUX : dEQP-EGL.functional.render.single_context.gles2.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.render.single_context.gles3.rgba8888_pixmap = SKIP
+2546 LINUX : dEQP-EGL.functional.thread_cleanup.* = SKIP
+2546 LINUX : dEQP-EGL.functional.native_color_mapping.native_window.* = FAIL
+2546 LINUX : dEQP-EGL.functional.native_coord_mapping.native_window.* = FAIL
+2546 LINUX : dEQP-EGL.functional.negative_api.choose_config = FAIL
+2546 LINUX : dEQP-EGL.functional.negative_api.swap_interval = FAIL
+2546 LINUX : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba8888_depth_stencil = FAIL
+2546 LINUX : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba8888_no_depth_no_stencil = FAIL
+
+// Linux Vulkan failures
+2635 LINUX VULKAN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba8888_depth_stencil = FAIL
+2635 LINUX VULKAN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba8888_no_depth_no_stencil = FAIL
+2715 LINUX VULKAN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb888_depth_stencil = FAIL
+2715 LINUX VULKAN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb888_no_depth_no_stencil = FAIL
+2716 LINUX VULKAN : dEQP-EGL.functional.preserve_swap.no_preserve.* = FAIL
+
+// Mac failures
+2546 MAC : dEQP-EGL.functional.native_color_mapping.native_window.* = FAIL
+2546 MAC : dEQP-EGL.functional.native_coord_mapping.native_window.* = FAIL
+2546 MAC : dEQP-EGL.functional.negative_api.choose_config = FAIL
+2546 MAC : dEQP-EGL.functional.negative_api.copy_buffers = FAIL
+2546 MAC : dEQP-EGL.functional.negative_api.swap_interval = FAIL
+2546 MAC : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba8888_depth_stencil = FAIL
+2546 MAC : dEQP-EGL.functional.thread_cleanup.* = SKIP
+
+// Android GLES-only failues
+2567 ANDROID GLES : dEQP-EGL.functional.image.api.create_image_gles2_tex2d_red = FAIL
+2567 ANDROID GLES : dEQP-EGL.functional.image.api.create_image_gles2_tex2d_rg = FAIL
+2716 ANDROID GLES : dEQP-EGL.functional.preserve_swap.preserve.* = FAIL
+
+// Android failures
+2546 ANDROID : dEQP-EGL.functional.buffer_age.* = FAIL
+3270 ANDROID : dEQP-EGL.functional.choose_config.simple.selection_only.transparent_red_value = FAIL
+3270 ANDROID : dEQP-EGL.functional.choose_config.simple.selection_only.transparent_green_value = FAIL
+3270 ANDROID : dEQP-EGL.functional.choose_config.simple.selection_only.transparent_blue_value = FAIL
+3270 ANDROID : dEQP-EGL.functional.choose_config.simple.selection_and_sort.transparent_red_value = FAIL
+3270 ANDROID : dEQP-EGL.functional.choose_config.simple.selection_and_sort.transparent_green_value = FAIL
+3270 ANDROID : dEQP-EGL.functional.choose_config.simple.selection_and_sort.transparent_blue_value = FAIL
+2546 ANDROID : dEQP-EGL.functional.color_clears.multi_context.* = SKIP
+2546 ANDROID : dEQP-EGL.functional.color_clears.single_context.* = SKIP
+2546 ANDROID : dEQP-EGL.functional.native_color_mapping.native_window.* = SKIP
+2546 ANDROID : dEQP-EGL.functional.native_coord_mapping.native_window.* = SKIP
+2546 ANDROID : dEQP-EGL.functional.negative_api.copy_buffers = FAIL
+2546 ANDROID : dEQP-EGL.functional.partial_update.odd_clear_* = FAIL
+2546 ANDROID : dEQP-EGL.functional.partial_update.odd_render_* = FAIL
+2546 ANDROID : dEQP-EGL.functional.partial_update.render_* = FAIL
+2546 ANDROID : dEQP-EGL.functional.render.multi_context.* = SKIP
+2546 ANDROID : dEQP-EGL.functional.render.single_context.* = SKIP
+2546 ANDROID : dEQP-EGL.functional.thread_cleanup.multi_context_* = SKIP
+2546 ANDROID : dEQP-EGL.functional.thread_cleanup.single_context_* = FAIL
+
+// Vulkan
+3081 VULKAN : dEQP-EGL.functional.image.create.gles2_renderbuffer_depth16_depth_buffer = SKIP
+3081 VULKAN : dEQP-EGL.functional.image.create.gles2_renderbuffer_stencil_stencil_buffer = SKIP
+3081 VULKAN : dEQP-EGL.functional.image.modify.renderbuffer_depth16_renderbuffer_clear_depth = SKIP
+3081 VULKAN : dEQP-EGL.functional.image.modify.renderbuffer_stencil_renderbuffer_clear_stencil = SKIP
+3081 VULKAN : dEQP-EGL.functional.image.render_multiple_contexts.gles2_renderbuffer_depth16_depth_buffer = SKIP
+3081 VULKAN : dEQP-EGL.functional.image.render_multiple_contexts.gles2_renderbuffer_stencil_stencil_buffer = SKIP
+
+// Android Vulkan
+2546 ANDROID VULKAN : dEQP-EGL.functional.create_surface.window.other = SKIP
+2546 ANDROID VULKAN : dEQP-EGL.functional.query_context.get_current_surface.other = SKIP
+2546 ANDROID VULKAN : dEQP-EGL.functional.query_surface.set_attribute.window.other = SKIP
+2546 ANDROID VULKAN : dEQP-EGL.functional.query_surface.simple.window.other = SKIP
+2546 ANDROID VULKAN : dEQP-EGL.functional.resize.pixel_density.* = SKIP
+2546 ANDROID VULKAN : dEQP-EGL.functional.wide_color.window* = SKIP
+
+// Robustness failures on multiple platforms
+3711 : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.reads.* = FAIL
+3711 : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.writes.* = FAIL
+
+// ES 1 tests
+2306 WIN : dEQP-EGL.functional.color_clears.single_context.gles1* = FAIL
+2306 WIN : dEQP-EGL.functional.color_clears.multi_context.gles1* = FAIL
+2306 MAC : dEQP-EGL.functional.color_clears.single_context.gles1* = FAIL
+2306 MAC : dEQP-EGL.functional.color_clears.multi_context.gles1* = FAIL
+2306 LINUX : dEQP-EGL.functional.color_clears.single_context.gles1* = FAIL
+2306 LINUX : dEQP-EGL.functional.color_clears.multi_context.gles1* = FAIL
+
+// Tests failing since the Jan 2018 roll of dEQP
+2341 : dEQP-EGL.functional.swap_buffers.* = SKIP
+2330 : dEQP-EGL.functional.robustness.create_context.no_reset_notification = SKIP
+2330 : dEQP-EGL.functional.robustness.create_context.lose_context_on_reset = SKIP
+2330 : dEQP-EGL.functional.robustness.reset_context.fixed_function_pipeline.reset_status.index_buffer_out_of_bounds = SKIP
+2330 : dEQP-EGL.functional.robustness.reset_context.fixed_function_pipeline.reset_status.vertex_buffer_out_of_bounds = SKIP
+
+// Tests were being hidden by flakiness (anglebug.com/3271)
+3325 : dEQP-EGL.functional.fence_sync.* = SKIP
+3325 : dEQP-EGL.functional.reusable_sync.* = SKIP
+
+// Nexus 5x
+2546 NEXUS5X : dEQP-EGL.functional.query_context.get_current_context.* = SKIP
+2546 NEXUS5X : dEQP-EGL.functional.query_context.get_current_display.* = SKIP
+2546 NEXUS5X : dEQP-EGL.functional.query_context.get_current_surface.r* = FAIL
+2546 NEXUS5X : dEQP-EGL.functional.query_context.query_context.* = SKIP
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles2_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles2_TestExpectations
new file mode 100644
index 0000000..55f7ae7
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles2_TestExpectations
@@ -0,0 +1,380 @@
+// Copyright 2015 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.
+
+// This file contains a list of defective dEQP conformance tests. The expected
+// format is:
+//  {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP}
+//
+// MODIFIERS can be a combination of the below list, combined with a logical AND:
+//  WIN XP VISTA WIN7 WIN8 WIN10
+//  MAC LEOPARD SNOWLEOPARD LION MOUNTAINLION MAVERICKS YOSEMITE ELCAPITAN SIERRA HIGHSIERRA MOJAVE
+//  LINUX CHROMEOS ANDROID
+//  NVIDIA AMD INTEL
+//  DEBUG RELEASE
+//  D3D9 D3D11 OPENGL GLES VULKAN
+//  NEXUS5X PIXEL2ORXL
+//  QUADROP400
+//
+//
+// TEST_NAME can be a specific test name, or have a '*' in the end, which
+// indicates a prefix matching.
+//
+// Examples:
+// fails on both windows and mac (crash)
+//  91530 WIN : context_lost_restored = SKIP
+//  91530 MAC : context_lost_restored = SKIP
+// fails on windows using NVIDIA GPUs
+//  91533 WIN NVIDIA : gl_min_uniforms = FAIL
+// fails on Nexus5X with GLES backend (hangs)
+//  91531 NEXUS5X GLES : conformance_more_* = SKIP
+
+// Skip these tests due to timeouts
+1034 : dEQP-GLES2.functional.flush_finish.* = SKIP
+
+// Failures related to not supporting separate depth/stencil masks on D3D11.
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_depth_funcs.stencil_* = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.* = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.depth_stencil.write_mask.* = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_constant_color_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_constant_color_one_minus_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_one_minus_constant_color_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_one_minus_constant_color_one_minus_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_constant_alpha_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_constant_alpha_one_minus_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_one_minus_constant_alpha_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_one_minus_constant_alpha_one_minus_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_constant_color_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_constant_color_one_minus_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_one_minus_constant_color_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_constant_alpha_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_constant_alpha_one_minus_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_one_minus_constant_alpha_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_constant_color_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_constant_color_one_minus_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_constant_alpha_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_constant_alpha_one_minus_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.random.* = FAIL
+1655 D3D11 : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.* = FAIL
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Temporary entries: they should be removed once the bugs are fixed.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Vertex attribute aliasing is not supported on D3D
+3467 D3D9 : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond* = FAIL
+3467 D3D9 : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond* = FAIL
+3467 D3D11 : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond* = FAIL
+3467 D3D11 : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond* = FAIL
+
+// Shader failures.
+3434 NEXUS5X GLES : dEQP-GLES2.functional.shaders.preprocessor.pragmas.pragma_* = FAIL
+
+// The fragment_ops.depth_stencil.random tests all seem to fail on D3D11.
+3282 D3D11 : dEQP-GLES2.functional.fragment_ops.depth_stencil.random.* = FAIL
+
+// Failures related to the depth_range on Windows / NVIDIA and ATI.
+2426 D3D11 : dEQP-GLES2.functional.depth_range.write.reverse = FAIL
+2426 D3D11 : dEQP-GLES2.functional.depth_range.write.half_to_zero = FAIL
+2426 D3D11 : dEQP-GLES2.functional.depth_range.write.one_to_half = FAIL
+2426 D3D11 : dEQP-GLES2.functional.depth_range.write.0_8_to_third = FAIL
+2426 D3D11 : dEQP-GLES2.functional.depth_range.compare.reverse = FAIL
+2426 D3D11 : dEQP-GLES2.functional.depth_range.compare.half_to_zero = FAIL
+2426 D3D11 : dEQP-GLES2.functional.depth_range.compare.one_to_half = FAIL
+2426 D3D11 : dEQP-GLES2.functional.depth_range.compare.0_8_to_third = FAIL
+
+// Windows D3D11 Intel and NVIDIA. Suppressed on all cards for simplicity.
+3292 D3D11 : dEQP-GLES2.functional.polygon_offset.default_render_with_units = FAIL
+3292 D3D11 : dEQP-GLES2.functional.polygon_offset.fixed16_render_with_units = FAIL
+
+// Common subexpression invariance
+3293 D3D11 : dEQP-GLES2.functional.shaders.invariance.highp.common_subexpression_1 = FAIL
+3293 D3D11 : dEQP-GLES2.functional.shaders.invariance.lowp.common_subexpression_1 = FAIL
+3293 D3D11 : dEQP-GLES2.functional.shaders.invariance.mediump.common_subexpression_1 = FAIL
+
+// Fails with significant image differences
+3295 D3D11 : dEQP-GLES2.functional.shaders.texture_functions.vertex.texturecubelod = FAIL
+
+// Only fails in D3D11 32-bit.
+1418 D3D11 : dEQP-GLES2.functional.clipping.triangle_vertex.clip_three.clip_pos_x_pos_y_pos_z_and_neg_x_pos_y_pos_z_and_neg_x_neg_y_neg_z = FAIL
+
+// D3D11 AMD
+2342 D3D11 AMD : dEQP-GLES2.functional.texture.size.cube.64x64_l8 = FAIL
+2342 D3D11 AMD : dEQP-GLES2.functional.texture.size.cube.64x64_rgb888 = FAIL
+2342 D3D11 AMD : dEQP-GLES2.functional.texture.size.cube.64x64_rgba8888 = FAIL
+
+// Additional texture.vertex.cube failures on AMD
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_nearest_repeat = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_linear_repeat = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.nearest_mipmap_linear_nearest_clamp = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.nearest_mipmap_linear_nearest_repeat = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.nearest_mipmap_linear_nearest_mirror = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.nearest_mipmap_linear_linear_clamp = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.nearest_mipmap_linear_linear_repeat = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.nearest_mipmap_linear_linear_mirror = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.wrap.repeat_clamp = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.wrap.repeat_repeat = FAIL
+3299 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.cube.wrap.repeat_mirror = FAIL
+
+// Quadro P400
+// TODO(jmadill): Narrow to P400 device only: 0x1CB3.
+2222 D3D11 NVIDIA : dEQP-GLES2.functional.shaders.functions.control_flow.return_in_nested_loop_fragment = FAIL
+2222 D3D11 NVIDIA : dEQP-GLES2.functional.shaders.functions.control_flow.return_in_nested_loop_vertex = FAIL
+
+// AMD GPU vertex shader texture sampling is not precise enough when rendering to 32-bit backbuffers
+2337 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.2d.wrap.* = FAIL
+2337 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.2d.filtering.linear_mipmap_linear_* = FAIL
+2337 D3D11 AMD : dEQP-GLES2.functional.texture.vertex.2d.filtering.nearest_mipmap_linear_* = FAIL
+
+// Several mipmap sub tests fail on AMD. Mark them all as failing conservatively.
+3296 D3D11 AMD : dEQP-GLES2.functional.texture.mipmap.* = FAIL
+
+// Failures on the D3D11 bots that do not reproduce locally
+// TODO(jmadill): Figure out why these fail on the bots, but not locally.
+1108 D3D11 : dEQP-GLES2.functional.shaders.struct.local.dynamic_loop_struct_array_fragment = FAIL
+1108 D3D11 : dEQP-GLES2.functional.shaders.invariance.highp.loop_2 = FAIL
+1108 D3D11 : dEQP-GLES2.functional.shaders.invariance.mediump.loop_2 = FAIL
+
+// OpenGL desktop back-end failures
+1656 OPENGL : dEQP-GLES2.functional.fbo.completeness.renderable.texture.color0.srgb8_alpha8 = FAIL
+1656 OPENGL : dEQP-GLES2.functional.fbo.completeness.renderable.texture.stencil.srgb8_alpha8 = FAIL
+1656 OPENGL : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.srgb8_alpha8 = FAIL
+3291 OPENGL : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_linear = FAIL
+
+// Linux OpenGL Intel
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.rasterization.interpolation.basic.lines_wide = FAIL
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.rasterization.interpolation.basic.line_strip_wide = FAIL
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.rasterization.interpolation.basic.line_loop_wide = FAIL
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.rasterization.interpolation.projected.lines_wide = FAIL
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.rasterization.interpolation.projected.line_strip_wide = FAIL
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.rasterization.interpolation.projected.line_loop_wide = FAIL
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.shaders.texture_functions.vertex.texturecubelod = FAIL
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_linear_repeat = FAIL
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_nearest_repeat = FAIL
+3302 OPENGL INTEL LINUX : dEQP-GLES2.functional.texture.vertex.cube.wrap.repeat_repeat = FAIL
+
+// Linux OpenGL NVIDIA
+3303 OPENGL NVIDIA LINUX : dEQP-GLES2.functional.texture.mipmap.cube.projected.nearest_linear = FAIL
+
+// Mac OpenGL specific failures
+3466 MAC OPENGL : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond* = SKIP
+3466 MAC OPENGL : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond* = SKIP
+3433 MAC OPENGL : dEQP-GLES2.functional.shaders.preprocessor.pragmas.pragma_vertex = FAIL
+1143 MAC OPENGL : dEQP-GLES2.functional.shaders.scoping.valid.local_int_variable_hides_struct_type_* = FAIL
+1143 MAC OPENGL : dEQP-GLES2.functional.shaders.scoping.valid.local_struct_variable_hides_struct_type_* = FAIL
+1143 MAC OPENGL : dEQP-GLES2.functional.shaders.scoping.valid.function_parameter_hides_struct_type_* = FAIL
+1143 MAC OPENGL : dEQP-GLES2.functional.shaders.random.trigonometric.vertex.65 = FAIL
+2631 MAC OPENGL : dEQP-GLES2.functional.shaders.operator.sequence.side_effects.affect_* = FAIL
+3317 MAC OPENGL : dEQP-GLES2.functional.shaders.linkage.varying_4 = FAIL
+
+// MAC OPENGL INTEL specific
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.complex_rgb = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.complex_rgba = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.long_masked_rgb = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.long_masked_rgba = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.masked_rgb = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.masked_rgba = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.masked_scissored_rgb = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.masked_scissored_rgba = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.scissored_rgb = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.scissored_rgba = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.color_clear.short_scissored_rgb = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.specification.basic_copyteximage2d.cube_alpha = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.specification.basic_copyteximage2d.cube_luminance = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.specification.basic_copyteximage2d.cube_luminance_alpha = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.specification.basic_copyteximage2d.cube_rgb = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.specification.basic_copyteximage2d.cube_rgba = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.shaders.discard.dynamic_loop_never = SKIP
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.shaders.discard.function_static_loop_never = SKIP
+2137 MAC OPENGL INTEL : dEQP-GLES2.functional.shaders.discard.static_loop_never = SKIP
+
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.polygon_offset.default_render_with_units = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.polygon_offset.fixed16_render_with_units = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.shaders.invariance.highp.common_subexpression_1 = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.shaders.invariance.highp.common_subexpression_3 = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.shaders.invariance.mediump.common_subexpression_1 = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.shaders.invariance.mediump.common_subexpression_3 = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.shaders.invariance.lowp.common_subexpression_1 = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.shaders.invariance.lowp.common_subexpression_3 = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_rgba8888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_rgb888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_rgba4444_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_l8_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_repeat_rgba8888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_repeat_rgb888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_repeat_rgba4444_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_repeat_l8_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_mirror_rgba8888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_mirror_rgb888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_mirror_rgba4444_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_mirror_l8_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_rgba8888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_rgb888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_rgba4444_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_l8_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_repeat_rgba8888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_repeat_rgb888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_repeat_rgba4444_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_repeat_l8_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_mirror_rgba8888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_mirror_rgb888_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_mirror_rgba4444_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_mirror_l8_pot = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.vertex.2d.filtering.linear_nearest_* = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_nearest_* = FAIL
+
+3531 MAC OPENGL INTEL : dEQP-GLES2.functional.fbo.render.color_clear.tex2d_rgb = FAIL
+3531 MAC OPENGL INTEL : dEQP-GLES2.functional.fbo.render.color_clear.tex2d_rgb_depth_component16 = FAIL
+3531 MAC OPENGL INTEL : dEQP-GLES2.functional.fbo.render.color_clear.tex2d_rgb_stencil_index8 = FAIL
+3531 MAC OPENGL INTEL : dEQP-GLES2.functional.fbo.render.stencil_clear.tex2d_rgb_stencil_index8 = FAIL
+
+// Mac AMD OpenGL specific
+2137 MAC OPENGL AMD : dEQP-GLES2.functional.clipping.point.wide_point_clip = FAIL
+3317 MAC OPENGL AMD : dEQP-GLES2.functional.clipping.point.wide_point_clip_viewport_center = FAIL
+3317 MAC OPENGL AMD : dEQP-GLES2.functional.clipping.point.wide_point_clip_viewport_corner = FAIL
+
+// Android GLES backend only failures
+1488 GLES ANDROID : dEQP-GLES2.functional.shaders.return.conditional_return_always_vertex = FAIL
+1488 GLES ANDROID : dEQP-GLES2.functional.shaders.return.conditional_return_always_fragment = FAIL
+1488 GLES ANDROID : dEQP-GLES2.functional.shaders.return.output_write_always_vertex = FAIL
+1488 GLES ANDROID : dEQP-GLES2.functional.shaders.return.output_write_always_fragment = FAIL
+2631 GLES ANDROID : dEQP-GLES2.functional.shaders.operator.sequence.side_effects.affect_* = FAIL
+2630 GLES ANDROID : dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_array_function_arg_* = FAIL
+2630 GLES ANDROID : dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_function_arg_* = FAIL
+
+// Nexus 5x failures
+3309 NEXUS5X GLES : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond* = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond* = FAIL
+3716 NEXUS5X GLES : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_int = FAIL
+3716 NEXUS5X GLES : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_short = FAIL
+3716 NEXUS5X GLES : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.depth_stencil_unsigned_int_24_8 = FAIL
+3716 NEXUS5X GLES : dEQP-GLES2.functional.fbo.completeness.renderable.texture.stencil.depth_stencil_unsigned_int_24_8 = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.fbo.render.texsubimage.after_render_tex2d_rgb = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.polygon_offset.default_result_depth_clamp = FAIL
+3715 NEXUS5X GLES : dEQP-GLES2.functional.shaders.builtin_variable.max_draw_buffers_vertex = FAIL
+3715 NEXUS5X GLES : dEQP-GLES2.functional.shaders.builtin_variable.max_draw_buffers_fragment = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.shaders.return.output_write_in_func_always_vertex = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.shaders.return.output_write_in_func_always_fragment = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.shaders.texture_functions.vertex.texturecubelod = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.texture.mipmap.cube.* = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_* = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.texture.vertex.cube.wrap.clamp_* = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.texture.vertex.cube.wrap.mirror_* = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.uniform_api.random.3 = FAIL
+3309 NEXUS5X GLES : dEQP-GLES2.functional.uniform_api.random.54 = FAIL
+
+// D3D11 AMD already covered by Line 148
+3243 D3D11 INTEL : dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_nearest = FAIL
+3243 D3D11 INTEL : dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_linear = FAIL
+3243 D3D11 INTEL : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_nearest = FAIL
+3243 D3D11 INTEL : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_linear = FAIL
+3243 D3D11 INTEL : dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_nearest = FAIL
+3243 D3D11 INTEL : dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_linear = FAIL
+3243 D3D11 NVIDIA : dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_nearest = FAIL
+3243 D3D11 NVIDIA : dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_linear = FAIL
+3243 D3D11 NVIDIA : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_nearest = FAIL
+3243 D3D11 NVIDIA : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_linear = FAIL
+3243 D3D11 NVIDIA : dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_nearest = FAIL
+3243 D3D11 NVIDIA : dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_linear = FAIL
+
+// Fail with very tiny pixel differences
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_nearest_clamp = FAIL
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_nearest_mirror = FAIL
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_linear_clamp = FAIL
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_linear_mirror = FAIL
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.wrap.clamp_clamp = FAIL
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.wrap.clamp_repeat = FAIL
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.wrap.clamp_mirror = FAIL
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.wrap.mirror_clamp = FAIL
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.wrap.mirror_repeat = FAIL
+3240 D3D11 : dEQP-GLES2.functional.texture.vertex.cube.wrap.mirror_mirror = FAIL
+
+// Android Vulkan backend only failures
+2549 VULKAN ANDROID : dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil* = SKIP
+4109 VULKAN ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.projected.nearest_linear = FAIL
+
+// Adreno line rasterization is not conformant.
+2830 VULKAN ANDROID : dEQP-GLES2.functional.rasterization.primitives.line_loop = FAIL
+2830 VULKAN ANDROID : dEQP-GLES2.functional.rasterization.primitives.line_strip = FAIL
+2830 VULKAN ANDROID : dEQP-GLES2.functional.rasterization.primitives.lines = FAIL
+
+// Failing on the Pixel 2.
+2808 VULKAN ANDROID : dEQP-GLES2.functional.shaders.builtin_variable.fragcoord_w = FAIL
+3306 VULKAN ANDROID : dEQP-GLES2.functional.polygon_offset.default_factor_1_slope = FAIL
+3306 VULKAN ANDROID : dEQP-GLES2.functional.polygon_offset.fixed16_factor_1_slope = 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
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_linear = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_nearest = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_linear = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_nearest = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_linear = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_nearest_clamp = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_nearest_mirror = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_linear_clamp = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_linear_linear_mirror = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.wrap.clamp_clamp = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.wrap.clamp_repeat = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.wrap.clamp_mirror = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.wrap.mirror_clamp = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.wrap.mirror_repeat = FAIL
+3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.vertex.cube.wrap.mirror_mirror = FAIL
+
+// Vulkan AMD drivers don't seem to support wide point clipping.
+2463 VULKAN WIN AMD : dEQP-GLES2.functional.clipping.point.wide_point_clip = FAIL
+2463 VULKAN WIN AMD : dEQP-GLES2.functional.clipping.point.wide_point_clip_viewport_center = FAIL
+2463 VULKAN WIN AMD : dEQP-GLES2.functional.clipping.point.wide_point_clip_viewport_corner = FAIL
+
+// These failures are possibly due to an AMD driver bug.
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.draw.random.14 = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.draw.random.30 = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.draw.random.41 = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.first.byte_first* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.first.float_first* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_17_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_2_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_32_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_17_17_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_17_2_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_17_32_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32_17_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32_32_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32_32_float* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_17_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_32_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_32_float* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_17_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_float* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_short* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_3_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_6_short* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_0_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_0_short* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_17_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_byte* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_float* = SKIP
+2847 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_short* = SKIP
+
+// Fails after OpenGL line rasterization rules implementation. Possibly a bug in FragCoord.
+2809 VULKAN WIN AMD : dEQP-GLES2.functional.clipping.line.long_line_clip = FAIL
+
+// Polygon offset failures
+3301 VULKAN WIN AMD : dEQP-GLES2.functional.polygon_offset.default_result_depth_clamp = FAIL
+3301 VULKAN WIN AMD : dEQP-GLES2.functional.polygon_offset.default_factor_1_slope = FAIL
+3301 VULKAN WIN AMD : dEQP-GLES2.functional.polygon_offset.fixed16_render_with_units = FAIL
+
+// Failures on newer NVIDIA drivers (411.95) and passes on older drivers (388.16).
+2976 VULKAN NVIDIA : dEQP-GLES2.functional.shaders.invariance.* = FAIL
+// Fails on 431.02 NVIDIA driver
+3748 VULKAN WIN NVIDIA : dEQP-GLES2.functional.fbo.render.repeated_clear.* = FAIL
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles31_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles31_TestExpectations
new file mode 100644
index 0000000..4fcbaa3
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles31_TestExpectations
@@ -0,0 +1,694 @@
+// Copyright 2016 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.
+
+// This file contains a list of defective dEQP conformance tests. The expected
+// format is:
+//  {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP}
+//
+// MODIFIERS can be a combination of the below list, combined with a logical AND:
+//  WIN XP VISTA WIN7 WIN8 WIN10
+//  MAC LEOPARD SNOWLEOPARD LION MOUNTAINLION MAVERICKS YOSEMITE ELCAPITAN SIERRA HIGHSIERRA MOJAVE
+//  LINUX CHROMEOS ANDROID
+//  NVIDIA AMD INTEL
+//  DEBUG RELEASE
+//  D3D9 D3D11 OPENGL GLES VULKAN
+//  NEXUS5X PIXEL2ORXL
+//  QUADROP400
+//  SWIFTSHADER
+//
+//
+// TEST_NAME can be a specific test name, or have a '*' in the end, which
+// indicates a prefix matching.
+//
+// Examples:
+// fails on both windows and mac (crash)
+//  91530 WIN : context_lost_restored = SKIP
+//  91530 MAC : context_lost_restored = SKIP
+// fails on windows using NVIDIA GPUs
+//  91533 WIN NVIDIA : gl_min_uniforms = FAIL
+// fails on Nexus5X with GLES backend (hangs)
+//  91531 NEXUS5X GLES : conformance_more_* = SKIP
+
+// Crashing Tests
+1920 NVIDIA D3D11 : dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_max = SKIP
+1442 D3D11 : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.builtin_gl_position = SKIP
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.builtin_gl_position = SKIP
+
+// Crashing Tests on Linux on Intel HD 630.
+2349 LINUX INTEL : dEQP-GLES31.functional.synchronization.in_invocation.image_* = SKIP
+2349 LINUX INTEL : dEQP-GLES31.functional.synchronization.inter_invocation.image_* = SKIP
+2349 LINUX INTEL : dEQP-GLES31.functional.compute.basic.copy_image_to_ssbo_small = SKIP
+2349 LINUX INTEL : dEQP-GLES31.functional.compute.basic.copy_ssbo_to_image_small = SKIP
+2349 LINUX INTEL : dEQP-GLES31.functional.compute.basic.image_barrier_multiple = SKIP
+
+// Failing Tests on Linux on Intel HD 630.
+2349 LINUX INTEL : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader.program_binary = FAIL
+
+1442 D3D11 : dEQP-GLES31.functional.image_load_store.* = SKIP
+
+// Times out shader compilation because it uses so many resources.
+3445 : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.48 = SKIP
+
+// D3D11 Failing Tests
+// Below cases are failed due to binding multi-UAVs to a single buffer is not supported in D3D backend.
+// http://anglebug.com/3032
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.single_struct.single_buffer* = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.single_struct_array.single_buffer* = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.single_buffer* = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.single_buffer* = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.single_buffer* = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.single_buffer* = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.single_buffer* = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.single_buffer* = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.single_buffer* = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.13 = FAIL
+3032 D3D11 : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer* = FAIL
+
+1442 D3D11 : dEQP-GLES31.functional.state_query.integer.max_compute_atomic_counters_* = FAIL
+1442 D3D11 : dEQP-GLES31.functional.state_query.integer.max_atomic_counter_buffer_size_* = FAIL
+1442 D3D11 : dEQP-GLES31.functional.state_query.integer.max_combined_atomic_counters* = FAIL
+1442 D3D11 : dEQP-GLES31.functional.state_query.integer.max_uniform_buffer_bindings_* = FAIL
+1442 D3D11 : dEQP-GLES31.functional.state_query.integer.max_combined_texture_image_units_* = FAIL
+1442 D3D11 : dEQP-GLES31.functional.state_query.program.compute_work_group_size_get_programiv = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.async.case_4_log = SKIP
+1442 D3D11 : dEQP-GLES31.functional.debug.async.case_5_callback = SKIP
+1442 D3D11 : dEQP-GLES31.functional.debug.error_filters.case_2 = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.error_filters.case_3 = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.error_filters.case_9 = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.error_filters.case_10 = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.error_filters.case_27 = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.error_filters.case_28 = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_2 = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_3 = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_9 = FAIL
+1442 D3D11 : dEQP-GLES31.functional.debug.error_groups.case_10 = FAIL
+
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.int_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.int_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.int_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.int_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.float_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.float_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.float_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.intbitstofloat.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.intbitstofloat.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.intbitstofloat.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.uintbitstofloat.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.uintbitstofloat.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.uintbitstofloat.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpacksnorm4x8_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackunorm4x8_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpacksnorm2x16_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm2x16_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm2x16_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm2x16_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackunorm2x16_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packhalf2x16_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackhalf2x16_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_lowp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_mediump_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_highp_geometry = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.builtin_constants.geometry_shader.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.state_query.program.geometry_shader_state_get_programiv = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.query.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.basic.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.conversion.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.emit.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.varying.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.layered.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.instanced.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.input.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.negative.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.geometry_shading.vertex_transform_feedback.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.shaders.linkage.es31.geometry.* = FAIL
+1941 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_directive.geometry_shader = FAIL
+1941 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.log.shader_directive.geometry_shader = FAIL
+1941 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_directive.geometry_shader = FAIL
+2826 D3D11 : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.* = FAIL
+2826 D3D11 : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.* = FAIL
+2826 D3D11 : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.* = FAIL
+3865 D3D11 : dEQP-GLES31.functional.compute.basic.copy_image_to_ssbo_large = FAIL
+3865 D3D11 : dEQP-GLES31.functional.compute.basic.copy_ssbo_to_image_large = FAIL
+
+// Failing with dEQP roll
+3447 D3D11 : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.22 = FAIL
+3447 D3D11 : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.41 = FAIL
+
+// OPENGL Failing Tests
+1665 WIN NVIDIA OPENGL : dEQP-GLES31.functional.draw_indirect.negative.command_offset_not_in_buffer_unsigned32_wrap = FAIL
+1442 NVIDIA OPENGL : dEQP-GLES31.functional.fbo.no_attachments.maximums.all = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by* = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.buffer_limited_query.resource_query = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.buffer_variable.* = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.program_input.* = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.program_output.* = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.* = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.* = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.* = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform.random.* = FAIL
+1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.* = FAIL
+
+// An NVIDIA bug seems to occur when sending GL commands in a certain order to the driver
+2432 NVIDIA OPENGL : dEQP-GLES31.functional.vertex_attribute_binding.usage.mixed_usage.mixed_api_change_binding_point = SKIP
+
+// OpenGL/D3D11 Failing Tests
+1442 OPENGL : dEQP-GLES31.functional.shaders.opaque_type_indexing.* = FAIL
+1442 D3D11 : dEQP-GLES31.functional.shaders.opaque_type_indexing.* = FAIL
+
+// OpenGL/D3D11/Vulkan Failing Tests
+1442 : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_100_calls_1k_invocations = FAIL
+
+// Waiting for Program pipeline functionality
+3570 : dEQP-GLES31.functional.state_query.integer.program_pipeline_binding_* = FAIL
+3570 : dEQP-GLES31.functional.state_query.program.program_separable_get_programiv = FAIL
+3570 : dEQP-GLES31.functional.state_query.program_pipeline.* = FAIL
+3570 : dEQP-GLES31.functional.debug.object_labels.program_pipeline = FAIL
+3570 : dEQP-GLES31.functional.separate_shader.* = FAIL
+
+// The following passes with Vulkan (with warning), but fails otherwise.  We'll keep the file simple by expecting it to fail.
+2324 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.compute.program_not_active = FAIL
+2324 : dEQP-GLES31.functional.debug.negative_coverage.log.compute.program_not_active = FAIL
+2324 : dEQP-GLES31.functional.debug.negative_coverage.get_error.compute.program_not_active = FAIL
+2324 : dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.draw_range_elements = FAIL
+2324 : dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.draw_range_elements_incomplete_primitive = FAIL
+
+// These tests are failing because of compile errors with SSBOs in compute shaders.
+1951 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.compute.exceed_shared_memory_size_limit = FAIL
+1951 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.compute.exceed_shared_memory_size_limit = FAIL
+1951 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.log.compute.exceed_shared_memory_size_limit = FAIL
+
+1442 D3D11 : dEQP-GLES31.functional.stencil_texturing.* = SKIP
+// TODO(xinghua.cao@intel.com): FAIL expectation instead of SKIP should be sufficient for OpenGL, but the
+// test expectations parser doesn't support having FAIL for GL and SKIP for D3D with the same test filter.
+
+1729 D3D11 : dEQP-GLES31.functional.atomic_counter.* = SKIP
+1951 D3D11 : dEQP-GLES31.functional.layout_binding.ssbo.* = SKIP
+1951 D3D11 : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.* = SKIP
+1442 D3D11 : dEQP-GLES31.functional.program_interface_query.* = SKIP
+1442 D3D11 : dEQP-GLES31.functional.synchronization.* = SKIP
+1442 D3D11 : dEQP-GLES31.functional.layout_binding.image.* = SKIP
+// This case is skipped since it uses atomic counter builtin functions which haven't been implemented.
+1729 D3D11 : dEQP-GLES31.functional.state_query.program.active_atomic_counter_buffers_get_programiv = SKIP
+
+// Vulkan Android failures
+4110 ANDROID VULKAN : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_8_samples_fwidth = FAIL
+4110 ANDROID VULKAN : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_8_samples_dfdy = FAIL
+4110 ANDROID VULKAN : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_max_samples_dfdx = FAIL
+4110 ANDROID VULKAN : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_max_samples_dfdy = FAIL
+4110 ANDROID VULKAN : dEQP-GLES31.functional.shaders.helper_invocation.value.lines_8_samples = FAIL
+4110 ANDROID VULKAN : dEQP-GLES31.functional.shaders.helper_invocation.value.triangles_max_samples = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.value.lines_8_samples = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.value.points_8_samples = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.value.triangles_max_samples = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_8_samples_dfdy = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_8_samples_dfdx = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_8_samples_fwidth = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_8_samples_dfdy = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_8_samples_dfdx = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_8_samples_fwidth = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_8_samples_dfdy = FAIL
+4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_max_samples_dfdx = FAIL
+
+// Debug failures that occur on Android:
+3590 VULKAN ANDROID : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.texparameterf = FAIL
+3590 VULKAN ANDROID : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.texparameterfv = FAIL
+
+// Passing on recent drivers:
+3726 VULKAN ANDROID : dEQP-GLES31.functional.ssbo.layout.* = FAIL
+3726 VULKAN ANDROID : dEQP-GLES31.functional.atomic_counter.* = FAIL
+3726 VULKAN ANDROID : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.*atomic_counter* = FAIL
+3726 VULKAN ANDROID : dEQP-GLES31.functional.compute.basic.atomic_counter* = FAIL
+
+// Validation error on SPIR-V (but only on Android, possibly related to issue 2703)
+3882 VULKAN ANDROID : dEQP-GLES31.functional.uniform_location.nested_array.*sampler* = FAIL
+
+// Arrays of opaque types as function parameters (possibly related to issue 3882)
+2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_vertex = FAIL
+2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_fragment = FAIL
+2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_compute = FAIL
+2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_vertex = FAIL
+2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_fragment = FAIL
+2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_compute = FAIL
+
+// General Vulkan failures
+
+// Front-end query bugs:
+3596 VULKAN : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.* = FAIL
+
+// Shader support:
+3565 VULKAN : dEQP-GLES31.functional.shaders.builtin_functions.texture_size.samples_* = SKIP
+
+// SSBO synchronization:
+4097 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_alias_overwrite = FAIL
+
+// 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
+
+// Framebuffer without attachments:
+3579 ANDROID VULKAN : dEQP-GLES31.functional.fbo.no_attachments.* = SKIP
+
+// Debug:
+3590 VULKAN : dEQP-GLES31.functional.debug.negative_coverage.*exceed_shared_memory_size_limit = FAIL
+
+// Stencil textures (some missing support for base level):
+3683 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.stencil_texturing.format.* = FAIL
+3683 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.stencil_texturing.misc.compare_mode_effect = FAIL
+
+// Need to support non-color when staging image updates
+4080 ANDROID VULKAN : dEQP-GLES31.functional.stencil_texturing.misc.base_level = SKIP
+
+// Multisampled textures:
+3565 VULKAN : dEQP-GLES31.functional.texture.multisample.* = SKIP
+3565 VULKAN : dEQP-GLES31.functional.state_query.texture*multisample.* = SKIP
+
+// Vulkan creates the image view with the same format as the texture.
+3885 VULKAN : dEQP-GLES31.functional.image_load_store.*.format_reinterpret.* = FAIL
+
+// Cannot create 2D (array) view of 3D texture.
+3886 VULKAN : dEQP-GLES31.functional.image_load_store.3d.*layer = FAIL
+
+// Inactive SSBOs with flexible array member (about 20% of these tests are affected):
+3714 VULKAN : dEQP-GLES31.functional.ssbo.layout.random.* = FAIL
+
+// OpenGL ES 3.1 conformance failures
+4098 SWIFTSHADER : dEQP-GLES31.functional.compute.basic.write_multiple_unsized_arr_multiple_groups = FAIL
+4098 SWIFTSHADER : dEQP-GLES31.functional.compute.basic.write_multiple_unsized_arr_single_invocation = FAIL
+
+4099 SWIFTSHADER : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.base_vertex.index_neg_* = FAIL
+
+4100 SWIFTSHADER : dEQP-GLES31.functional.draw_indirect.random.30 = FAIL
+4100 SWIFTSHADER : dEQP-GLES31.functional.draw_indirect.random.39 = FAIL
+
+4101 SWIFTSHADER : dEQP-GLES31.functional.multisample.default_framebuffer.sample_position = FAIL
+
+4102 SWIFTSHADER : dEQP-GLES31.functional.state_query.integer.max_framebuffer_height_getfloat = FAIL
+4102 SWIFTSHADER : dEQP-GLES31.functional.state_query.integer.max_framebuffer_height_getinteger = FAIL
+4102 SWIFTSHADER : dEQP-GLES31.functional.state_query.integer.max_framebuffer_height_getinteger64 = FAIL
+4102 SWIFTSHADER : dEQP-GLES31.functional.state_query.integer.max_framebuffer_width_getfloat = FAIL
+4102 SWIFTSHADER : dEQP-GLES31.functional.state_query.integer.max_framebuffer_width_getinteger = FAIL
+4102 SWIFTSHADER : dEQP-GLES31.functional.state_query.integer.max_framebuffer_width_getinteger64 = FAIL
+
+4103 SWIFTSHADER : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.* = FAIL
+
+4104 SWIFTSHADER : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_immutable_format_float = FAIL
+4104 SWIFTSHADER : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_immutable_format_integer = FAIL
+4104 SWIFTSHADER : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_immutable_levels_float = FAIL
+4104 SWIFTSHADER : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_immutable_levels_integer = FAIL
+
+4105 SWIFTSHADER : dEQP-GLES31.functional.stencil_texturing.format.depth24_stencil8_cube = FAIL
+4105 SWIFTSHADER : dEQP-GLES31.functional.stencil_texturing.format.depth32f_stencil8_cube = FAIL
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles3_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles3_TestExpectations
new file mode 100644
index 0000000..b58c083
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles3_TestExpectations
@@ -0,0 +1,597 @@
+// Copyright 2015 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.
+
+// This file contains a list of defective dEQP conformance tests. The expected
+// format is:
+//  {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP}
+//
+// MODIFIERS can be a combination of the below list, combined with a logical AND:
+//  WIN XP VISTA WIN7 WIN8 WIN10
+//  MAC LEOPARD SNOWLEOPARD LION MOUNTAINLION MAVERICKS YOSEMITE ELCAPITAN SIERRA HIGHSIERRA MOJAVE
+//  LINUX CHROMEOS ANDROID
+//  NVIDIA AMD INTEL
+//  DEBUG RELEASE
+//  D3D9 D3D11 OPENGL GLES VULKAN
+//  NEXUS5X PIXEL2ORXL
+//  QUADROP400
+//
+//
+// TEST_NAME can be a specific test name, or have a '*' in the end, which
+// indicates a prefix matching.
+//
+// Examples:
+// fails on both windows and mac (crash)
+//  91530 WIN : context_lost_restored = SKIP
+//  91530 MAC : context_lost_restored = SKIP
+// fails on windows using NVIDIA GPUs
+//  91533 WIN NVIDIA : gl_min_uniforms = FAIL
+// fails on Nexus5X with GLES backend (hangs)
+//  91531 NEXUS5X GLES : conformance_more_* = SKIP
+
+// Don't run these tests for faster turnover
+1101 : dEQP-GLES3.functional.flush_finish.* = SKIP
+
+// TODO(jmadill): Figure out why these fail on the bots, but not locally.
+1108 WIN D3D11 : dEQP-GLES3.functional.shaders.struct.local.dynamic_loop_struct_array_fragment = FAIL
+1094 WIN D3D11 : dEQP-GLES3.functional.shaders.invariance.highp.loop_2 = FAIL
+1094 WIN D3D11 : dEQP-GLES3.functional.shaders.invariance.mediump.loop_2 = FAIL
+
+// We can't support distinct texture sizes in D3D11.
+1097 WIN D3D11 : dEQP-GLES3.functional.fbo.completeness.size.distinct = FAIL
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Temporary entries: they should be removed once the bugs are fixed.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Failures related to using a depth/stencil enabled backbuffer on Windows / NVIDIA.
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.shaders.invariance.highp.common_subexpression_1 = FAIL
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.shaders.invariance.mediump.common_subexpression_1 = FAIL
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.shaders.invariance.lowp.common_subexpression_1 = FAIL
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.fbo.invalidate.default.render_all = SKIP
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.fbo.invalidate.default.render_depth_stencil = SKIP
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.fbo.invalidate.default.bind_depth_stencil = SKIP
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.fbo.invalidate.default.draw_framebuffer_all = SKIP
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.fbo.invalidate.default.read_framebuffer_all = SKIP
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.fbo.invalidate.default.bind_all = SKIP
+2428 D3D11 NVIDIA : dEQP-GLES3.functional.polygon_offset.default_render_with_units = SKIP
+
+// Tests were being hidden by flakiness (anglebug.com/3271)
+3329 D3D11 NVIDIA : dEQP-GLES3.functional.transform_feedback.interpolation.flat.* = FAIL
+3329 D3D11 NVIDIA : dEQP-GLES3.functional.transform_feedback.basic_types.interleaved.triangles.* = FAIL
+3329 D3D11 NVIDIA : dEQP-GLES3.functional.transform_feedback.basic_types.separate.triangles.* = FAIL
+
+// Missing the SampleCmp instruction in vertex shaders.
+1435 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturelod.sampler2dshadow_vertex = FAIL
+1435 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.sampler2dshadow_vertex = FAIL
+1435 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.sampler2dshadow_vertex = FAIL
+1435 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.sampler2dshadow_vertex = FAIL
+
+// SampleCmp is missing gradient/offset parameters in HLSL.
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturelod.sampler2dshadow_fragment = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.sampler2dshadow_fragment = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.sampler2dshadow_fragment = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.sampler2dshadow_fragment = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2dshadow_vertex = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2dshadow_fragment = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darrayshadow_vertex = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darrayshadow_fragment = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2dshadow_vertex = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2dshadow_fragment = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2darrayshadow_vertex = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2darrayshadow_fragment = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2dshadow_vertex = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2dshadow_fragment = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler2dshadow_vertex = FAIL
+1436 WIN D3D11 : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler2dshadow_fragment = FAIL
+
+// DrawBuffers test failing on D3D11.
+3298 WIN D3D11 : dEQP-GLES3.functional.shaders.fragdata.draw_buffers = FAIL
+
+// TODO(jmadill, cwallez): triage the failures below into permanent and temporary failures
+
+// Quadro P400
+// TODO(jmadill): Narrow to P400 device only: 0x1CB3.
+2222 D3D11 NVIDIA : dEQP-GLES3.functional.shaders.functions.control_flow.return_in_nested_loop_fragment = FAIL
+2222 D3D11 NVIDIA : dEQP-GLES3.functional.shaders.functions.control_flow.return_in_nested_loop_vertex = FAIL
+2222 D3D11 NVIDIA : dEQP-GLES3.functional.texture.mipmap.2d.min_lod.linear_nearest = FAIL
+2222 D3D11 NVIDIA : dEQP-GLES3.functional.texture.mipmap.2d.min_lod.nearest_nearest = FAIL
+2222 D3D11 NVIDIA : dEQP-GLES3.functional.texture.mipmap.3d.min_lod.linear_nearest = FAIL
+2222 D3D11 NVIDIA : dEQP-GLES3.functional.texture.mipmap.3d.min_lod.nearest_nearest = FAIL
+2222 D3D11 NVIDIA : dEQP-GLES3.functional.texture.mipmap.cube.min_lod.linear_nearest = FAIL
+2222 D3D11 NVIDIA : dEQP-GLES3.functional.texture.mipmap.cube.min_lod.nearest_nearest = FAIL
+
+// Flaky on Win7 D3D11 NVIDIA
+4070 WIN7 D3D11 NVIDIA : dEQP-GLES3.functional.rasterization.flatshading.triangles = FAIL
+
+// Vertex attribute aliasing is not supported on D3D
+3467 D3D9 : dEQP-GLES3.functional.attribute_location.bind_aliasing.cond* = FAIL
+3467 D3D9 : dEQP-GLES3.functional.attribute_location.bind_aliasing.max_cond* = FAIL
+3467 D3D11 : dEQP-GLES3.functional.attribute_location.bind_aliasing.cond* = FAIL
+3467 D3D11 : dEQP-GLES3.functional.attribute_location.bind_aliasing.max_cond* = FAIL
+
+// Windows and Linux failures
+1095 LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.* = FAIL
+
+// Windows only failure
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.depth_stencil.stencil_depth_funcs.stencil_* = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.depth_stencil.stencil_ops.* = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.depth_stencil.write_mask.* = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.depth_stencil.random.* = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_one_minus_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_one_minus_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_one_minus_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_one_minus_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_one_minus_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_one_minus_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_one_minus_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_one_minus_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_one_minus_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_one_minus_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_one_minus_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_one_minus_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.random.* = FAIL
+1096 WIN D3D11 : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.* = FAIL
+1101 WIN D3D11 : dEQP-GLES3.functional.polygon_offset.fixed16_render_with_units = FAIL
+1101 WIN D3D11 : dEQP-GLES3.functional.polygon_offset.fixed24_render_with_units = FAIL
+1101 WIN D3D11 : dEQP-GLES3.functional.lifetime.attach.deleted_input.buffer_vertex_array = FAIL
+
+// Basic line transform feedback tests flaky on Windows.
+2676 WIN D3D11 : dEQP-GLES3.functional.transform_feedback.basic_types.interleaved.lines.* = FAIL
+2676 WIN D3D11 : dEQP-GLES3.functional.transform_feedback.basic_types.separate.lines.* = FAIL
+
+// Very small threshold issue. Could upstream a higher tolerance to dEQP.
+2323 WIN D3D11 : dEQP-GLES3.functional.texture.units.2_units.only_cube.7 = FAIL
+
+// Blit related failures on D3D11
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_dst_x = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_dst_y = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_x = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_y = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_linear = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_dst_x_linear = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_dst_y_linear = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_dst_x_linear = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_dst_y_linear = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_x_linear = FAIL
+3297 WIN D3D11 : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_y_linear = FAIL
+
+// Windows AMD specific failures
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.blit.depth_stencil.depth24_stencil8_scale = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.blit.depth_stencil.depth24_stencil8_stencil_only = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.r11f_g11f_b10f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.rg32f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.rg16f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.r32f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.r16f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.rgb16f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.rg8 = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.rgb10_a2 = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.rgba16f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.blit.tex2d.r8 = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.rgba32f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.rgba16f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.r11f_g11f_b10f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.rg32f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.rg16f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.r32f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.r16f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.rgb16f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.rg8 = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.r8 = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.rgb10_a2 = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.fbo.render.shared_colorbuffer_clear.tex2d_rgb16f = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.interpolation.lines = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.lines = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.filtering.cube.formats.rgb10_a2_nearest_mipmap_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.filtering.cube.formats.rgb565_nearest_mipmap_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.filtering.cube.formats.rgba16f_nearest_mipmap_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.mipmap.2d.min_lod.nearest_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.mipmap.2d.min_lod.linear_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.mipmap.2d.max_lod.nearest_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.mipmap.2d.max_lod.linear_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.mipmap.3d.min_lod.nearest_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.mipmap.3d.min_lod.linear_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.mipmap.3d.max_lod.nearest_nearest = FAIL
+1633 WIN D3D11 AMD : dEQP-GLES3.functional.texture.mipmap.3d.max_lod.linear_nearest = FAIL
+
+// D3D11 Intel specific
+
+1349 D3D11 INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.6 = FAIL
+1349 D3D11 INTEL : dEQP-GLES3.functional.texture.units.2_units.only_2d_array.8 = FAIL
+1349 D3D11 INTEL : dEQP-GLES3.functional.texture.units.2_units.only_3d.8 = FAIL
+1349 D3D11 INTEL : dEQP-GLES3.functional.texture.units.2_units.mixed.0 = FAIL
+1349 D3D11 INTEL : dEQP-GLES3.functional.texture.units.2_units.mixed.8 = FAIL
+1349 D3D11 INTEL : dEQP-GLES3.functional.texture.units.2_units.mixed.9 = FAIL
+1349 D3D11 INTEL : dEQP-GLES3.functional.texture.units.4_units.only_3d.3 = FAIL
+2349 D3D11 INTEL : dEQP-GLES3.functional.texture.mipmap.2d.min_lod.nearest_nearest = FAIL
+2349 D3D11 INTEL : dEQP-GLES3.functional.texture.mipmap.2d.min_lod.linear_nearest = FAIL
+2349 D3D11 INTEL : dEQP-GLES3.functional.texture.mipmap.3d.min_lod.nearest_nearest = FAIL
+2349 D3D11 INTEL : dEQP-GLES3.functional.texture.mipmap.3d.min_lod.linear_nearest = FAIL
+2349 D3D11 INTEL : dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives.lines = FAIL
+2349 D3D11 INTEL : dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.interpolation.lines = FAIL
+2349 D3D11 INTEL : dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.lines = FAIL
+2349 D3D11 INTEL : dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.interpolation.lines = FAIL
+
+// Failing Tests on Windows and Mac on Intel HD 630
+2137 WIN INTEL : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.* = FAIL
+2137 MAC INTEL : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.* = FAIL
+
+// Linux only failures
+
+// UBO tests trigger crashes when getting the program info log, skip them until this is fixed.
+1323 LINUX OPENGL : dEQP-GLES3.functional.ubo.* = SKIP
+
+1323 LINUX OPENGL : dEQP-GLES3.functional.fbo.depth.depth_test_clamp.depth_component32f = FAIL
+1323 LINUX OPENGL : dEQP-GLES3.functional.fbo.depth.depth_test_clamp.depth32f_stencil8 = FAIL
+1323 LINUX OPENGL : dEQP-GLES3.functional.fbo.depth.depth_write_clamp.depth_component32f = FAIL
+1323 LINUX OPENGL : dEQP-GLES3.functional.fbo.depth.depth_write_clamp.depth32f_stencil8 = FAIL
+1323 LINUX OPENGL : dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.points = FAIL
+
+// While loops with 'continue' seem flaky on Linux. (Possibly all GL renderers)
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.conditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.conditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.unconditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.unconditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.only_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.only_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.double_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.double_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.mixed_break_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.mixed_break_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.conditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.conditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.unconditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.unconditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.only_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.only_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.double_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.double_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.mixed_break_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.mixed_break_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.conditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.conditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.unconditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.unconditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.only_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.only_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.double_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.double_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.mixed_break_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.mixed_break_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.conditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.conditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.unconditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.unconditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.only_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.only_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.double_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.double_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.mixed_break_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.mixed_break_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.conditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.conditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.unconditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.unconditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.only_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.only_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.double_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.double_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.mixed_break_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.mixed_break_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.conditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.conditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.unconditional_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.unconditional_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.only_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.only_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.double_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.double_continue_fragment = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.mixed_break_continue_vertex = FAIL
+1324 LINUX OPENGL : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.mixed_break_continue_fragment = FAIL
+
+// Polygon offset failures
+3304 LINUX OPENGL : dEQP-GLES3.functional.polygon_offset.float32_factor_1_slope = FAIL
+3304 LINUX OPENGL : dEQP-GLES3.functional.polygon_offset.float32_result_depth_clamp = FAIL
+
+// Flaky test
+3305 LINUX OPENGL : dEQP-GLES3.functional.shaders.builtin_functions.common.uintbitstofloat.uint_highp_vertex = FAIL
+
+// Linux Intel specific
+2349 LINUX OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.default_framebuffer* = FAIL
+
+// Mac failures (overbroad suppresions)
+3466 MAC OPENGL : dEQP-GLES3.functional.attribute_location.bind_aliasing.cond* = SKIP
+3466 MAC OPENGL : dEQP-GLES3.functional.attribute_location.bind_aliasing.max_cond* = SKIP
+2137 MAC OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.* = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_* = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.implementation_limits.compressed_texture_formats = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.implementation_limits.num_compressed_texture_formats = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.primitive_restart.* = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.linkage.varying.rules.vertex_declare_fragment_use = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.scoping.valid.function_parameter_hides_struct_type_fragment = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.scoping.valid.function_parameter_hides_struct_type_vertex = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.scoping.valid.local_int_variable_hides_struct_type_fragment = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.scoping.valid.local_int_variable_hides_struct_type_vertex = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.scoping.valid.local_struct_variable_hides_struct_type_fragment = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.scoping.valid.local_struct_variable_hides_struct_type_vertex = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.state_query.integers.compressed_texture_formats_getfloat = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.state_query.integers.compressed_texture_formats_getinteger = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.state_query.integers.compressed_texture_formats_getinteger64 = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.dither.disabled.* = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.fragment_ops.depth_stencil.stencil_depth_funcs.stencil_* = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.arrays.complex_expression.and_short_circuits_* = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.arrays.complex_expression.or_short_circuits_* = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.fragdata.valid_static_index = FAIL
+2137 MAC OPENGL : dEQP-GLES3.functional.shaders.loops.short_circuit.* = FAIL
+3317 MAC OPENGL : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_linear = FAIL
+
+// ETC compressed formats not supported
+3853 MAC OPENGL : dEQP-GLES3.functional.negative_api.texture.compressedtexsubimage* = FAIL
+3853 MAC OPENGL : dEQP-GLES3.functional.negative_api.texture.generatemipmap = FAIL
+
+// Mac AMD failures
+2137 MAC OPENGL AMD : dEQP-GLES3.functional.clipping.point.wide_point_clip = FAIL
+2137 MAC OPENGL AMD : dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_center = FAIL
+2137 MAC OPENGL AMD : dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_corner = FAIL
+2137 MAC OPENGL AMD : dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_nearest = FAIL
+2137 MAC OPENGL AMD : dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_* = FAIL
+2137 MAC OPENGL AMD : dEQP-GLES3.functional.texture.mipmap.2d.projected.* = FAIL
+2137 MAC OPENGL AMD : dEQP-GLES3.functional.transform_feedback.* = FAIL
+
+3317 MAC OPENGL AMD : dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.* = FAIL
+3317 MAC OPENGL AMD : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.isampler3d_vertex = FAIL
+3317 MAC OPENGL AMD : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.usampler3d_vertex = FAIL
+
+// Mac Intel crashes
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.discard.function_static_loop_never = SKIP
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.discard.dynamic_loop_never = SKIP
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.discard.static_loop_never = SKIP
+
+// Mac Intel failures
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.color_clear.* = FAIL
+// All the out of bounds variants fail.
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_src_dst_y = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_dst_y = FAIL
+// Fails for all integer formats
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.completeness.attachment_combinations.none_rbo_none_none = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.completeness.attachment_combinations.none_tex_none_none = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.polygon_offset.default_render_with_units = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.polygon_offset.fixed16_render_with_units = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.polygon_offset.fixed24_render_with_units = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.builtin_functions.precision.cos.highp_* = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.builtin_functions.precision.sin.highp_* = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.invariance.lowp.common_subexpression_1 = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.invariance.lowp.common_subexpression_3 = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.invariance.mediump.common_subexpression_1 = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.invariance.mediump.common_subexpression_3 = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.invariance.highp.common_subexpression_1 = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.invariance.highp.common_subexpression_3 = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset.usampler2d_fragment = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset.usampler2d_vertex  = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.usampler3d_fragment  = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.usampler3d_fragment  = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.usamplercube_fragment  = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.usamplercube_vertex  = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturelod.usamplercube_fragment  = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturelod.usamplercube_vertex  = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.usampler3d_fragment  = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.usampler3d_fragment  = FAIL
+// Fails the integer npot cases = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.format.sized.cube.* = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.specification.basic_copyteximage2d.cube_alpha = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.specification.basic_copyteximage2d.cube_luminance = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.specification.basic_copyteximage2d.cube_luminance_alpha = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.specification.basic_copyteximage2d.cube_rgb = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.specification.basic_copyteximage2d.cube_rgba = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.specification.random_teximage2d.2d_5 = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.specification.teximage3d_* = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.specification.texsubimage3d_* = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.ubo.* = FAIL
+2137 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset.* = FAIL
+
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_src_x = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_dst_x = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_src_dst_x = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_x = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_dst_x = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_dst_x = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_x = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_dst_x = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_dst_x = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_dst_y = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.filtering.2d_array.combinations.linear_nearest_* = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.filtering.2d.combinations.linear_nearest_* = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.filtering.3d.combinations.linear_nearest_* = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.filtering.cube.combinations.linear_nearest_* = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.mipmap.cube.max_level.linear_nearest = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.vertex.2d_array.filtering.linear_nearest_* = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.vertex.2d.filtering.linear_nearest_* = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.vertex.3d.filtering.linear_nearest_* = FAIL
+3317 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.vertex.cube.filtering.linear_nearest_* = FAIL
+
+3531 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.invalidate.format.rgb8 = FAIL
+3531 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.render.resize.tex2d_rgb16f = FAIL
+3531 MAC OPENGL INTEL : dEQP-GLES3.functional.fbo.render.resize.tex2d_rgb8 = FAIL
+
+// Android only failures
+1487 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.red_half_float_oes = FAIL
+1487 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.rg_half_float_oes = FAIL
+1487 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.depth_stencil_unsigned_int_24_8 = FAIL
+1487 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth_stencil_unsigned_int_24_8 = FAIL
+1487 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_short = FAIL
+1487 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_int = FAIL
+1964 ANDROID GLES : dEQP-GLES3.functional.occlusion_query.* = FAIL
+1962 ANDROID GLES : dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.basic_2_fragment = FAIL
+1962 ANDROID GLES : dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.basic_2_vertex = FAIL
+1962 ANDROID GLES : dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.defined_macro_undef_fragment = FAIL
+1962 ANDROID GLES : dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.defined_macro_undef_vertex = FAIL
+1963 ANDROID GLES : dEQP-GLES3.functional.shaders.return.conditional_return_always_fragment = FAIL
+1963 ANDROID GLES : dEQP-GLES3.functional.shaders.return.conditional_return_always_vertex = FAIL
+1963 ANDROID GLES : dEQP-GLES3.functional.shaders.return.output_write_always_fragment = FAIL
+1963 ANDROID GLES : dEQP-GLES3.functional.shaders.return.output_write_always_vertex = FAIL
+1963 ANDROID GLES : dEQP-GLES3.functional.shaders.return.output_write_in_func_always_fragment = FAIL
+1963 ANDROID GLES : dEQP-GLES3.functional.shaders.return.output_write_in_func_always_vertex = FAIL
+1529 ANDROID GLES : dEQP-GLES3.functional.texture.mipmap.2d.generate.a8_* = FAIL
+1529 ANDROID GLES : dEQP-GLES3.functional.texture.mipmap.2d.generate.l8_* = FAIL
+1529 ANDROID GLES : dEQP-GLES3.functional.texture.mipmap.2d.generate.la88_* = FAIL
+1529 ANDROID GLES : dEQP-GLES3.functional.texture.mipmap.cube.generate.a8_* = FAIL
+1529 ANDROID GLES : dEQP-GLES3.functional.texture.mipmap.cube.generate.l8_* = FAIL
+1529 ANDROID GLES : dEQP-GLES3.functional.texture.mipmap.cube.generate.la88_* = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.basic_types.interleaved.* = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.basic_types.separate.* = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.interpolation.* = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.point_size.* = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.position.* = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.lines.5 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.lines.8 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.lines.10 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.points.6 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.points.7 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.triangles.2 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.separate.lines.4 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.separate.lines.6 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.separate.lines.8 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.separate.points.4 = FAIL
+1531 ANDROID GLES : dEQP-GLES3.functional.transform_feedback.random.separate.triangles.4 = FAIL
+2629 ANDROID GLES : dEQP-GLES3.functional.shaders.struct.local.array_member_equality_fragment = SKIP
+2629 ANDROID GLES : dEQP-GLES3.functional.shaders.struct.local.array_member_equality_vertex = SKIP
+2627 ANDROID GLES : dEQP-GLES3.functional.shaders.arrays.complex_expression.and_short_circuits_* = FAIL
+2627 ANDROID GLES : dEQP-GLES3.functional.shaders.arrays.complex_expression.or_short_circuits_* = FAIL
+2628 ANDROID GLES : dEQP-GLES3.functional.shaders.indexing.moredynamic.user_defined_fncall_inout_parameter_fragment = FAIL
+2628 ANDROID GLES : dEQP-GLES3.functional.shaders.indexing.moredynamic.user_defined_fncall_inout_parameter_with_index_with_side_effects_fragment = FAIL
+2628 ANDROID GLES : dEQP-GLES3.functional.shaders.indexing.moredynamic.user_defined_fncall_out_parameter_fragment = FAIL
+2627 ANDROID GLES : dEQP-GLES3.functional.shaders.loops.short_circuit.* = FAIL
+
+2567 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.red_unsigned_byte = FAIL
+2567 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.rg_unsigned_byte = FAIL
+2567 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.red_unsigned_byte = FAIL
+2567 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.rg_unsigned_byte = FAIL
+
+// Nexus 5x failures
+3308 NEXUS5X GLES : dEQP-GLES3.functional.attribute_location.bind_aliasing.cond* = FAIL
+3308 NEXUS5X GLES : dEQP-GLES3.functional.attribute_location.bind_aliasing.max_cond* = FAIL
+3308 NEXUS5X GLES : dEQP-GLES3.functional.polygon_offset.default_result_depth_clamp = FAIL
+3308 NEXUS5X GLES : dEQP-GLES3.functional.polygon_offset.fixed24_result_depth_clamp = FAIL
+3308 NEXUS5X GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.lines.3 = FAIL
+3308 NEXUS5X GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.triangles.8 = FAIL
+3308 NEXUS5X GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.triangles.10 = FAIL
+2322 NEXUS5X GLES : dEQP-GLES3.functional.shaders.metamorphic.* = SKIP
+
+// Seems to fail on all desktop GL
+2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8 = FAIL
+2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_out_of_bounds_blit_to_default = FAIL
+2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_scale_blit_to_default = FAIL
+2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_nearest_scale_blit_to_default = FAIL
+
+// Fails on Windows + Linux.
+2222 OPENGL NVIDIA : dEQP-GLES3.functional.fbo.completeness.samples.rbo2_rbo2_rbo0 = FAIL
+
+// General Vulkan failures
+
+// Tests failing due to the "flat" qualifier in the shader:
+3677 VULKAN : dEQP-GLES3.functional.fragment_out.basic.int.* = FAIL
+3677 VULKAN : dEQP-GLES3.functional.fragment_out.basic.uint.* = FAIL
+3677 VULKAN : dEQP-GLES3.functional.fragment_out.array.int* = FAIL
+3677 VULKAN : dEQP-GLES3.functional.fragment_out.array.uint* = FAIL
+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
+
+// 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
+
+// Flat shading:
+3430 VULKAN : dEQP-GLES3.functional.rasterization.flatshading.* = FAIL
+
+// Misc unimplemented:
+
+// Failures on newer NVIDIA drivers (411.95) and passes on older drivers (388.16).  Passes on 418.12 on Linux.
+2976 VULKAN NVIDIA : dEQP-GLES3.functional.shaders.invariance.* = FAIL
+// Fails on 431.02 NVIDIA driver
+3748 VULKAN WIN NVIDIA : dEQP-GLES3.functional.fbo.color.repeated_clear.sample.tex2d.* = FAIL
+
+// Android Vulkan failures
+3306 ANDROID VULKAN : dEQP-GLES3.functional.polygon_offset.* = FAIL
+2830 ANDROID VULKAN : dEQP-GLES3.functional.rasterization.fbo.rbo_singlesample.primitives.lines = FAIL
+2830 ANDROID VULKAN : dEQP-GLES3.functional.rasterization.fbo.texture_2d.primitives.lines = FAIL
+2830 ANDROID VULKAN : dEQP-GLES3.functional.rasterization.primitives.line* = FAIL
+2808 ANDROID VULKAN : dEQP-GLES3.functional.shaders.builtin_variable.fragcoord_w = FAIL
+
+// Pixel driver issues
+4024 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.draw.random.5 = SKIP
+4024 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.draw.random.49 = SKIP
+4024 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.draw.random.96 = FAIL
+
+// Fixed in later driver versions.
+2727 VULKAN ANDROID : dEQP-GLES3.functional.shaders.builtin_variable.pointcoord = FAIL
+
+//  New or broken formats in ES 3.0, may be it relates to VK_IMAGE_USAGE_STORAGE_BIT
+3816 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.texture.specification.texstorage3d.format.rgba16* = FAIL
+3816 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.texture.specification.texstorage3d.format.rgb16* = FAIL
+3816 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.texture.specification.texstorage3d.format.rg32* = FAIL
+
+// Fails only with SwiftShader:
+
+// These only fail for a 565 config
+4016 SWIFTSHADER : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.27 = FAIL
+4016 SWIFTSHADER : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.80 = FAIL
+
+// These only fail on Android
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.sampler2D_samplerCube_both = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.sampler2D_samplerCube_fragment = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.sampler2D_samplerCube_vertex = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.struct_in_array.sampler2D_samplerCube_both = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.struct_in_array.sampler2D_samplerCube_fragment = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.struct_in_array.sampler2D_samplerCube_vertex = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_value.render.nested_structs_arrays.sampler2D_samplerCube_both = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_value.render.nested_structs_arrays.sampler2D_samplerCube_fragment = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_value.render.nested_structs_arrays.sampler2D_samplerCube_vertex = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_value.render.struct_in_array.sampler2D_samplerCube_both = FAIL
+4045 SWIFTSHADER : dEQP-GLES3.functional.uniform_api.value.assigned.by_value.render.struct_in_array.sampler2D_samplerCube_fragment = FAIL
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles2_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles2_TestExpectations
new file mode 100644
index 0000000..2146add
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles2_TestExpectations
@@ -0,0 +1,33 @@
+// 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.
+
+// This file contains a list of defective dEQP conformance tests. The expected
+// format is:
+//  {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP}
+//
+// MODIFIERS can be a combination of the below list, combined with a logical AND:
+//  WIN XP VISTA WIN7 WIN8 WIN10
+//  MAC LEOPARD SNOWLEOPARD LION MOUNTAINLION MAVERICKS YOSEMITE ELCAPITAN SIERRA HIGHSIERRA MOJAVE
+//  LINUX CHROMEOS ANDROID
+//  NVIDIA AMD INTEL
+//  DEBUG RELEASE
+//  D3D9 D3D11 OPENGL GLES VULKAN
+//  NEXUS5X PIXEL2ORXL
+//  QUADROP400
+//
+//
+// TEST_NAME can be a specific test name, or have a '*' in the end, which
+// indicates a prefix matching.
+//
+// Examples:
+// fails on both windows and mac (crash)
+//  91530 WIN : context_lost_restored = SKIP
+//  91530 MAC : context_lost_restored = SKIP
+// fails on windows using NVIDIA GPUs
+//  91533 WIN NVIDIA : gl_min_uniforms = FAIL
+// fails on Nexus5X with GLES backend (hangs)
+//  91531 NEXUS5X GLES : conformance_more_* = SKIP
+
+// Depth/stencil related failures.
+3457 VULKAN : KHR-GLES2.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth_stencil = FAIL
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles31_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles31_TestExpectations
new file mode 100644
index 0000000..f8c825e
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles31_TestExpectations
@@ -0,0 +1,134 @@
+// 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.
+
+// This file contains a list of defective dEQP conformance tests. The expected
+// format is:
+//  {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP}
+//
+// MODIFIERS can be a combination of the below list, combined with a logical AND:
+//  WIN XP VISTA WIN7 WIN8 WIN10
+//  MAC LEOPARD SNOWLEOPARD LION MOUNTAINLION MAVERICKS YOSEMITE ELCAPITAN SIERRA HIGHSIERRA MOJAVE
+//  LINUX CHROMEOS ANDROID
+//  NVIDIA AMD INTEL
+//  DEBUG RELEASE
+//  D3D9 D3D11 OPENGL GLES VULKAN
+//  NEXUS5X PIXEL2ORXL
+//  QUADROP400
+//
+//
+// TEST_NAME can be a specific test name, or have a '*' in the end, which
+// indicates a prefix matching.
+//
+// Examples:
+// fails on both windows and mac (crash)
+//  91530 WIN : context_lost_restored = SKIP
+//  91530 MAC : context_lost_restored = SKIP
+// fails on windows using NVIDIA GPUs
+//  91533 WIN NVIDIA : gl_min_uniforms = FAIL
+// fails on Nexus5X with GLES backend (hangs)
+//  91531 NEXUS5X GLES : conformance_more_* = SKIP
+
+// For now we only log Vulkan test expectations. More back-ends can follow as we need them.
+
+// Android Vulkan expectations
+
+// General Vulkan expectations
+
+// Limits:
+// GL_MIN/MAX_PROGRAM_TEXTURE_GATHER_OFFSET not set.
+3605 VULKAN : KHR-GLES31.core.texture_gather.* = FAIL
+
+// Dispatch indirect:
+3601 VULKAN : KHR-GLES31.core.compute_shader* = SKIP
+
+// Multisampled textures:
+3565 VULKAN : KHR-GLES31.core.texture_storage_multisample.* = SKIP
+
+// 2D array and 3D textures for compute shaders:
+3810 VULKAN : KHR-GLES31.core.layout_binding.sampler2DArray_layout_binding_texture_ComputeShader = SKIP
+3810 VULKAN : KHR-GLES31.core.layout_binding.sampler3D_layout_binding_texture_ComputeShader = SKIP
+
+// Program Pipeline Objects:
+3570 VULKAN : KHR-GLES31.core.shader_atomic_counters.advanced-usage-many-draw-calls2 = FAIL
+3570 VULKAN : KHR-GLES31.core.shader_atomic_counters.advanced-usage-many-dispatches = FAIL
+
+// Separate shader objects:
+3570 VULKAN : KHR-GLES31.core.sepshaderobjs* = FAIL
+
+// Shader support:
+3569 : KHR-GLES31.core.shader_integer_mix.* = FAIL
+3569 : KHR-GLES31.core.shader_image* = SKIP
+3569 : KHR-GLES31.core.shader_macros* = FAIL
+3569 : KHR-GLES31.core.shader_bitfield_operation.frexp.* = SKIP
+3569 : KHR-GLES31.core.shader_bitfield_operation.uaddCarry.* = SKIP
+3569 : KHR-GLES31.core.shader_bitfield_operation.usubBorrow.* = SKIP
+3569 : KHR-GLES31.core.shader_bitfield_operation.umulExtended.* = SKIP
+3569 : KHR-GLES31.core.shader_bitfield_operation.imulExtended.* = SKIP
+
+// Trigger Vulkan validation errors:
+4145 VULKAN : KHR-GLES31.core.vertex_attrib_binding.basic-* = FAIL
+
+// Crashes in libnvidia-glvkspirv.so, fixed in newer drivers
+4128 VULKAN NVIDIA : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength-cs-*-matC* = SKIP
+4128 VULKAN NVIDIA : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength-vs-*-matC* = SKIP
+4128 VULKAN NVIDIA : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength-fs-*-matC* = SKIP
+4128 VULKAN NVIDIA : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength-cs-*-struct* = SKIP
+4128 VULKAN NVIDIA : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength-vs-*-struct* = SKIP
+4128 VULKAN NVIDIA : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength-fs-*-struct* = SKIP
+4128 VULKAN NVIDIA : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength-cs-*-matR* = SKIP
+4128 VULKAN NVIDIA : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength-vs-*-matR* = SKIP
+4128 VULKAN NVIDIA : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength-fs-*-matR* = SKIP
+
+// Bug with binding the zero buffer and glBindBufferRange:
+4147 : KHR-GLES31.core.shader_storage_buffer_object.basic-binding = FAIL
+
+// Error with detecting some atomic counter buffer uses:
+4150 : KHR-GLES31.core.shader_storage_buffer_object.basic-atomic-case3-cs = FAIL
+4150 : KHR-GLES31.core.shader_storage_buffer_object.basic-atomic-case3-vsfs = FAIL
+
+// Unimplemented glValidateCreateShaderProgramv:
+4146 : KHR-GLES31.core.shader_storage_buffer_object.basic-syntaxSSO = FAIL
+4146 : KHR-GLES31.core.vertex_attrib_binding.advanced-bindingUpdate = FAIL
+4146 : KHR-GLES31.core.vertex_attrib_binding.advanced-largeStrideAndOffsetsNewAndLegacyAPI = FAIL
+
+// Draw indirect:
+3564 VULKAN : KHR-GLES31.core.draw_indirect.* = SKIP
+
+// Explicit uniform locations: triggers ASSERT.
+4132 : KHR-GLES31.core.explicit_uniform_location.* = SKIP
+
+// Program interface query.
+3596 VULKAN : KHR-GLES31.core.program_interface_query.* = FAIL
+
+// Framebuffer without attachments:
+3579 VULKAN : KHR-GLES31.core.framebuffer_no_attachments.api = FAIL
+
+// Arrays-of-arrays as vertex inputs:
+4148 : KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays2 = FAIL
+
+// Blend equations:
+3586 VULKAN : KHR-GLES31.core.blend_equation_advanced.* = SKIP
+
+// Storage image front-end crash when unbinding images (given texture 0)
+4124 VULKAN : KHR-GLES31.core.layout_binding.sampler2D_layout_binding_texture_ComputeShader = SKIP
+4124 VULKAN : KHR-GLES31.core.layout_binding.block_layout_binding_block_ComputeShader = SKIP
+4124 VULKAN : KHR-GLES31.core.layout_binding.buffer_layout_binding_atomicAdd_ComputeShader = SKIP
+4124 VULKAN : KHR-GLES31.core.layout_binding.atomic_uint_layout_binding_atomic_ComputeShader = SKIP
+4124 VULKAN : KHR-GLES31.core.layout_binding.image2D_layout_binding_imageLoad_ComputeShader = SKIP
+4124 VULKAN : KHR-GLES31.core.layout_binding.image2D_layout_binding_imageLoad_FragmentShader = SKIP
+4124 VULKAN : KHR-GLES31.core.layout_binding.image2D_layout_binding_imageLoad_VertexShader = SKIP
+
+// Passing on recent drivers:
+3726 VULKAN ANDROID : KHR-GLES31.core.shader_atomic_counters.* = FAIL
+3726 VULKAN ANDROID : KHR-GLES31.core.shader_atomic_counters.advanced-usage-* = SKIP
+
+// Crashes on Android
+3520 VULKAN ANDROID : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength* = SKIP
+
+// OpenGL ES 3.1 conformance failures
+4107 SWIFTSHADER : KHR-GLES31.core.shader_storage_buffer_object.advanced-switchBuffers-vs = FAIL
+
+4106 SWIFTSHADER : KHR-GLES31.core.layout_binding.sampler*_layout_binding_texture_* = FAIL
+
+4108 SWIFTSHADER : KHR-GLES31.core.shader_image_size.*-nonMS-* = SKIP
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles3_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles3_TestExpectations
new file mode 100644
index 0000000..6293f81
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles3_TestExpectations
@@ -0,0 +1,181 @@
+// 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.
+
+// This file contains a list of defective dEQP conformance tests. The expected
+// format is:
+//  {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP}
+//
+// MODIFIERS can be a combination of the below list, combined with a logical AND:
+//  WIN XP VISTA WIN7 WIN8 WIN10
+//  MAC LEOPARD SNOWLEOPARD LION MOUNTAINLION MAVERICKS YOSEMITE ELCAPITAN SIERRA HIGHSIERRA MOJAVE
+//  LINUX CHROMEOS ANDROID
+//  NVIDIA AMD INTEL
+//  DEBUG RELEASE
+//  D3D9 D3D11 OPENGL GLES VULKAN
+//  NEXUS5X PIXEL2ORXL
+//  QUADROP400
+//
+//
+// TEST_NAME can be a specific test name, or have a '*' in the end, which
+// indicates a prefix matching.
+//
+// Examples:
+// fails on both windows and mac (crash)
+//  91530 WIN : context_lost_restored = SKIP
+//  91530 MAC : context_lost_restored = SKIP
+// fails on windows using NVIDIA GPUs
+//  91533 WIN NVIDIA : gl_min_uniforms = FAIL
+// fails on Nexus5X with GLES backend (hangs)
+//  91531 NEXUS5X GLES : conformance_more_* = SKIP
+
+// For now we only log Vulkan test expectations. More back-ends can follow as we need them.
+
+// Depth/stencil related failures due to Vulkan driver bugs.
+3683 VULKAN ANDROID : KHR-GLES3.packed_depth_stencil.*.depth24_stencil8 = FAIL
+3683 VULKAN ANDROID : KHR-GLES3.packed_depth_stencil.*.depth32f_stencil8 = FAIL
+
+// CopyTexImage conversion failing due to Vulkan validation error re: UINT/SINT-descriptor-set issue.
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture_array_texture2d = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture_array_cubemap_negx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture_array_cubemap_negy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture_array_cubemap_negz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture_array_cubemap_posx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture_array_cubemap_posy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture_array_cubemap_posz = FAIL
+
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture2d_texture2d = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture2d_cubemap_negx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture2d_cubemap_negy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture2d_cubemap_negz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture2d_cubemap_posx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture2d_cubemap_posy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture2d_cubemap_posz = FAIL
+
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negx_texture2d = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negx_cubemap_negx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negx_cubemap_negy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negx_cubemap_negz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negx_cubemap_posx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negx_cubemap_posy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negx_cubemap_posz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negy_texture2d = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negy_cubemap_negx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negy_cubemap_negy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negy_cubemap_negz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negy_cubemap_posx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negy_cubemap_posy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negy_cubemap_posz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negz_texture2d = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negz_cubemap_negx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negz_cubemap_negy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negz_cubemap_negz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negz_cubemap_posx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negz_cubemap_posy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_negz_cubemap_posz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posx_texture2d = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posx_cubemap_negx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posx_cubemap_negy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posx_cubemap_negz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posx_cubemap_posx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posx_cubemap_posy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posx_cubemap_posz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posy_texture2d = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posy_cubemap_negx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posy_cubemap_negy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posy_cubemap_negz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posy_cubemap_posx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posy_cubemap_posy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posy_cubemap_posz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posz_texture2d = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posz_cubemap_negx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posz_cubemap_negy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posz_cubemap_negz = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posz_cubemap_posx = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posz_cubemap_posy = FAIL
+3817 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.cubemap_posz_cubemap_posz = FAIL
+
+// glCopyTexImage from 3D textures is failing and getting the following Vulkan Validation errors:
+//
+//  ImageView must not be a 2D or 2DArray view of a 3D image. The Vulkan spec states:
+//  imageView must not be 2D or 2D array image view created from a 3D image
+//
+3836 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture3d_texture2d = FAIL
+3836 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture3d_cubemap_negx = FAIL
+3836 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture3d_cubemap_negy = FAIL
+3836 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture3d_cubemap_negz = FAIL
+3836 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture3d_cubemap_posx = FAIL
+3836 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture3d_cubemap_posy = FAIL
+3836 VULKAN : KHR-GLES3.copy_tex_image_conversions.required.texture3d_cubemap_posz = FAIL
+
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.r8 = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rg8 = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rg8i = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rg8ui = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgb8 = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba8 = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba8i = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba8ui = FAIL
+
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rg16i = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rg16ui = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rg16f = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgb16f = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba16i = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba16ui = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba16f = FAIL
+
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rg32i = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rg32ui = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rg32f = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba32i = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba32ui = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba32f = FAIL
+
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgb = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgb565 = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgb5_a1 = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.srgb8_alpha8 = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba = FAIL
+3836 VULKAN : KHR-GLES3.packed_pixels.varied_rectangle.rgba4 = FAIL
+
+
+// Fails only with SwiftShader:
+
+// These only fail on Android
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_dynamic_loop_write_static_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_dynamic_loop_write_static_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_dynamic_write_static_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_dynamic_write_static_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_static_loop_write_static_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_static_loop_write_static_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_static_write_dynamic_loop_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_static_write_dynamic_loop_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_static_write_dynamic_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_static_write_dynamic_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_static_write_static_loop_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat2x4_static_write_static_loop_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_dynamic_loop_write_static_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_dynamic_loop_write_static_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_dynamic_write_static_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_dynamic_write_static_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_static_loop_write_static_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_static_loop_write_static_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_static_write_dynamic_loop_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_static_write_dynamic_loop_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_static_write_dynamic_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_static_write_dynamic_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_static_write_static_loop_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat3x4_static_write_static_loop_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_dynamic_loop_write_static_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_dynamic_loop_write_static_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_dynamic_write_static_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_dynamic_write_static_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_static_loop_write_static_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_static_loop_write_static_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_static_write_dynamic_loop_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_static_write_dynamic_loop_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_static_write_dynamic_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_static_write_dynamic_read_vertex = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_static_write_static_loop_read_fragment = FAIL
+4019 SWIFTSHADER : KHR-GLES3.shaders.indexing.matrix_subscript.mat4_static_write_static_loop_read_vertex = FAIL
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/glcShaderConstExprTests_override.cpp b/Source/ThirdParty/ANGLE/src/tests/deqp_support/glcShaderConstExprTests_override.cpp
new file mode 100644
index 0000000..21fb6b6
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/glcShaderConstExprTests_override.cpp
@@ -0,0 +1,643 @@
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * 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.
+ *
+ * \file  glcShaderConstExprTests.cpp
+ * \brief Declares shader constant expressions tests.
+ */ /*-------------------------------------------------------------------*/
+
+#include <map>
+#include "deMath.h"
+#include "deSharedPtr.hpp"
+#include "glcShaderConstExprTests.hpp"
+#include "glsShaderExecUtil.hpp"
+#include "gluContextInfo.hpp"
+#include "gluShaderUtil.hpp"
+#include "tcuFloat.hpp"
+#include "tcuStringTemplate.hpp"
+#include "tcuTestLog.hpp"
+
+using namespace deqp::gls::ShaderExecUtil;
+
+namespace glcts
+{
+
+namespace ShaderConstExpr
+{
+
+struct TestParams
+{
+    const char *name;
+    const char *expression;
+
+    glu::DataType inType;
+    int minComponents;
+    int maxComponents;
+
+    glu::DataType outType;
+    union
+    {
+        float outputFloat;
+        int outputInt;
+    };
+};
+
+struct ShaderExecutorParams
+{
+    deqp::Context *context;
+
+    std::string caseName;
+    std::string source;
+
+    glu::DataType outType;
+    union
+    {
+        float outputFloat;
+        int outputInt;
+    };
+};
+
+template <typename OutputType>
+class ExecutorTestCase : public deqp::TestCase
+{
+  public:
+    ExecutorTestCase(deqp::Context &context,
+                     const char *name,
+                     glu::ShaderType shaderType,
+                     const ShaderSpec &shaderSpec,
+                     OutputType expectedOutput);
+    virtual ~ExecutorTestCase(void);
+    virtual tcu::TestNode::IterateResult iterate(void);
+
+  protected:
+    void validateOutput(de::SharedPtr<ShaderExecutor> executor);
+
+    glu::ShaderType m_shaderType;
+    ShaderSpec m_shaderSpec;
+    OutputType m_expectedOutput;
+};
+
+template <typename OutputType>
+ExecutorTestCase<OutputType>::ExecutorTestCase(deqp::Context &context,
+                                               const char *name,
+                                               glu::ShaderType shaderType,
+                                               const ShaderSpec &shaderSpec,
+                                               OutputType expectedOutput)
+    : deqp::TestCase(context, name, ""),
+      m_shaderType(shaderType),
+      m_shaderSpec(shaderSpec),
+      m_expectedOutput(expectedOutput)
+{}
+
+template <typename OutputType>
+ExecutorTestCase<OutputType>::~ExecutorTestCase(void)
+{}
+
+template <>
+void ExecutorTestCase<float>::validateOutput(de::SharedPtr<ShaderExecutor> executor)
+{
+    float result        = 0.0f;
+    void *const outputs = &result;
+    executor->execute(1, DE_NULL, &outputs);
+
+    const float epsilon = 0.01f;
+    if (de::abs(m_expectedOutput - result) > epsilon)
+    {
+        m_context.getTestContext().getLog()
+            << tcu::TestLog::Message << "Expected: " << m_expectedOutput << " ("
+            << tcu::toHex(tcu::Float32(m_expectedOutput).bits())
+            << ") but constant expresion returned: " << result << " ("
+            << tcu::toHex(tcu::Float32(result).bits()) << "), used " << epsilon
+            << " epsilon for comparison" << tcu::TestLog::EndMessage;
+        m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
+        return;
+    }
+
+    m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
+    return;
+}
+
+template <>
+void ExecutorTestCase<int>::validateOutput(de::SharedPtr<ShaderExecutor> executor)
+{
+    int result          = 0;
+    void *const outputs = &result;
+    executor->execute(1, DE_NULL, &outputs);
+
+    if (result == m_expectedOutput)
+    {
+        m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
+        return;
+    }
+
+    m_context.getTestContext().getLog()
+        << tcu::TestLog::Message << "Expected: " << m_expectedOutput
+        << " but constant expresion returned: " << result << tcu::TestLog::EndMessage;
+    m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
+}
+
+template <typename OutputType>
+tcu::TestNode::IterateResult ExecutorTestCase<OutputType>::iterate(void)
+{
+    de::SharedPtr<ShaderExecutor> executor(
+        createExecutor(m_context.getRenderContext(), m_shaderType, m_shaderSpec));
+
+    DE_ASSERT(executor.get());
+
+    executor->log(m_context.getTestContext().getLog());
+
+    try
+    {
+        if (!executor->isOk())
+            TCU_FAIL("Compilation failed");
+
+        executor->useProgram();
+
+        validateOutput(executor);
+    }
+    catch (const tcu::NotSupportedError &e)
+    {
+        m_testCtx.getLog() << tcu::TestLog::Message << e.what() << tcu::TestLog::EndMessage;
+        m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, e.getMessage());
+    }
+    catch (const tcu::TestError &e)
+    {
+        m_testCtx.getLog() << tcu::TestLog::Message << e.what() << tcu::TestLog::EndMessage;
+        m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, e.getMessage());
+    }
+
+    return tcu::TestNode::STOP;
+}
+
+template <typename OutputType>
+void createTestCasesForAllShaderTypes(const ShaderExecutorParams &params,
+                                      std::vector<tcu::TestNode *> &outputTests)
+{
+    DE_ASSERT(params.context);
+
+    deqp::Context &context       = *(params.context);
+    glu::ContextType contextType = context.getRenderContext().getType();
+
+    ShaderSpec shaderSpec;
+    shaderSpec.version = glu::getContextTypeGLSLVersion(contextType);
+    shaderSpec.source  = params.source;
+    shaderSpec.outputs.push_back(
+        Symbol("out0", glu::VarType(params.outType, glu::PRECISION_HIGHP)));
+
+    // Construct list of shaders for which tests can be created
+    std::vector<glu::ShaderType> shaderTypes;
+
+    if (glu::contextSupports(contextType, glu::ApiType::core(4, 3)))
+    {
+        shaderTypes.push_back(glu::SHADERTYPE_VERTEX);
+        shaderTypes.push_back(glu::SHADERTYPE_FRAGMENT);
+        shaderTypes.push_back(glu::SHADERTYPE_COMPUTE);
+        shaderTypes.push_back(glu::SHADERTYPE_GEOMETRY);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_CONTROL);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_EVALUATION);
+    }
+    else if (glu::contextSupports(contextType, glu::ApiType::es(3, 2)))
+    {
+        shaderSpec.version = glu::GLSL_VERSION_320_ES;
+        shaderTypes.push_back(glu::SHADERTYPE_GEOMETRY);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_CONTROL);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_EVALUATION);
+    }
+    else if (glu::contextSupports(contextType, glu::ApiType::es(3, 1)))
+    {
+        shaderSpec.version = glu::GLSL_VERSION_310_ES;
+        shaderTypes.push_back(glu::SHADERTYPE_COMPUTE);
+        shaderTypes.push_back(glu::SHADERTYPE_GEOMETRY);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_CONTROL);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_EVALUATION);
+    }
+    else
+    {
+        shaderTypes.push_back(glu::SHADERTYPE_VERTEX);
+        shaderTypes.push_back(glu::SHADERTYPE_FRAGMENT);
+    }
+
+    shaderSpec.globalDeclarations += "precision highp float;\n";
+
+    for (std::size_t typeIndex = 0; typeIndex < shaderTypes.size(); ++typeIndex)
+    {
+        glu::ShaderType shaderType = shaderTypes[typeIndex];
+        std::string caseName(params.caseName + '_' + getShaderTypeName(shaderType));
+
+        outputTests.push_back(
+            new ExecutorTestCase<OutputType>(context, caseName.c_str(), shaderType, shaderSpec,
+                                             static_cast<OutputType>(params.outputFloat)));
+    }
+}
+
+void createTests(deqp::Context &context,
+                 const TestParams *cases,
+                 int numCases,
+                 const char *shaderTemplateSrc,
+                 const char *casePrefix,
+                 std::vector<tcu::TestNode *> &outputTests)
+{
+    const tcu::StringTemplate shaderTemplate(shaderTemplateSrc);
+    const char *componentAccess[] = {"", ".y", ".z", ".w"};
+
+    ShaderExecutorParams shaderExecutorParams;
+    shaderExecutorParams.context = &context;
+
+    for (int caseIndex = 0; caseIndex < numCases; caseIndex++)
+    {
+        const TestParams &testCase   = cases[caseIndex];
+        const std::string baseName   = testCase.name;
+        const int minComponents      = testCase.minComponents;
+        const int maxComponents      = testCase.maxComponents;
+        const glu::DataType inType   = testCase.inType;
+        const std::string expression = testCase.expression;
+
+        // Check for presence of func(vec, scalar) style specialization,
+        // use as gatekeeper for applying said specialization
+        const bool alwaysScalar = expression.find("${MT}") != std::string::npos;
+
+        std::map<std::string, std::string> shaderTemplateParams;
+        shaderTemplateParams["CASE_BASE_TYPE"] = glu::getDataTypeName(testCase.outType);
+
+        shaderExecutorParams.outType     = testCase.outType;
+        shaderExecutorParams.outputFloat = testCase.outputFloat;
+
+        for (int component = minComponents - 1; component < maxComponents; component++)
+        {
+            // Get type name eg. float, vec2, vec3, vec4 (same for other primitive types)
+            glu::DataType dataType = static_cast<glu::DataType>(inType + component);
+            std::string typeName   = glu::getDataTypeName(dataType);
+
+            // ${T} => final type, ${MT} => final type but with scalar version usable even when T is
+            // a vector
+            std::map<std::string, std::string> expressionTemplateParams;
+            expressionTemplateParams["T"]  = typeName;
+            expressionTemplateParams["MT"] = typeName;
+
+            const tcu::StringTemplate expressionTemplate(expression);
+
+            // Add vector access to expression as needed
+            shaderTemplateParams["CASE_EXPRESSION"] =
+                expressionTemplate.specialize(expressionTemplateParams) +
+                componentAccess[component];
+
+            {
+                // Add type to case name if we are generating multiple versions
+                shaderExecutorParams.caseName = (casePrefix + baseName);
+                if (minComponents != maxComponents)
+                    shaderExecutorParams.caseName += ("_" + typeName);
+
+                shaderExecutorParams.source = shaderTemplate.specialize(shaderTemplateParams);
+                if (shaderExecutorParams.outType == glu::TYPE_FLOAT)
+                    createTestCasesForAllShaderTypes<float>(shaderExecutorParams, outputTests);
+                else
+                    createTestCasesForAllShaderTypes<int>(shaderExecutorParams, outputTests);
+            }
+
+            // Deal with functions that allways accept one ore more scalar parameters even when
+            // others are vectors
+            if (alwaysScalar && component > 0)
+            {
+                shaderExecutorParams.caseName =
+                    casePrefix + baseName + "_" + typeName + "_" + glu::getDataTypeName(inType);
+
+                expressionTemplateParams["MT"] = glu::getDataTypeName(inType);
+                shaderTemplateParams["CASE_EXPRESSION"] =
+                    expressionTemplate.specialize(expressionTemplateParams) +
+                    componentAccess[component];
+
+                shaderExecutorParams.source = shaderTemplate.specialize(shaderTemplateParams);
+                if (shaderExecutorParams.outType == glu::TYPE_FLOAT)
+                    createTestCasesForAllShaderTypes<float>(shaderExecutorParams, outputTests);
+                else
+                    createTestCasesForAllShaderTypes<int>(shaderExecutorParams, outputTests);
+            }
+        }  // component loop
+    }
+}
+
+}  // namespace ShaderConstExpr
+
+ShaderConstExprTests::ShaderConstExprTests(deqp::Context &context)
+    : deqp::TestCaseGroup(context, "constant_expressions", "Constant expressions")
+{}
+
+ShaderConstExprTests::~ShaderConstExprTests(void) {}
+
+void ShaderConstExprTests::init(void)
+{
+    // Needed for autogenerating shader code for increased component counts
+    DE_STATIC_ASSERT(glu::TYPE_FLOAT + 1 == glu::TYPE_FLOAT_VEC2);
+    DE_STATIC_ASSERT(glu::TYPE_FLOAT + 2 == glu::TYPE_FLOAT_VEC3);
+    DE_STATIC_ASSERT(glu::TYPE_FLOAT + 3 == glu::TYPE_FLOAT_VEC4);
+
+    DE_STATIC_ASSERT(glu::TYPE_INT + 1 == glu::TYPE_INT_VEC2);
+    DE_STATIC_ASSERT(glu::TYPE_INT + 2 == glu::TYPE_INT_VEC3);
+    DE_STATIC_ASSERT(glu::TYPE_INT + 3 == glu::TYPE_INT_VEC4);
+
+    DE_STATIC_ASSERT(glu::TYPE_UINT + 1 == glu::TYPE_UINT_VEC2);
+    DE_STATIC_ASSERT(glu::TYPE_UINT + 2 == glu::TYPE_UINT_VEC3);
+    DE_STATIC_ASSERT(glu::TYPE_UINT + 3 == glu::TYPE_UINT_VEC4);
+
+    DE_STATIC_ASSERT(glu::TYPE_BOOL + 1 == glu::TYPE_BOOL_VEC2);
+    DE_STATIC_ASSERT(glu::TYPE_BOOL + 2 == glu::TYPE_BOOL_VEC3);
+    DE_STATIC_ASSERT(glu::TYPE_BOOL + 3 == glu::TYPE_BOOL_VEC4);
+
+    // ${T} => final type, ${MT} => final type but with scalar version usable even when T is a
+    // vector
+    const ShaderConstExpr::TestParams baseCases[] = {
+        {"radians",
+         "radians(${T} (90.0))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_FLOAT,
+         {deFloatRadians(90.0f)}},
+        {"degrees",
+         "degrees(${T} (2.0))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_FLOAT,
+         {deFloatDegrees(2.0f)}},
+        {"sin", "sin(${T} (3.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {deFloatSin(3.0f)}},
+        {"cos", "cos(${T} (3.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {deFloatCos(3.2f)}},
+        {"asin", "asin(${T} (0.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {deFloatAsin(0.0f)}},
+        {"acos", "acos(${T} (1.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {deFloatAcos(1.0f)}},
+        {"pow",
+         "pow(${T} (1.7), ${T} (3.5))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_FLOAT,
+         {deFloatPow(1.7f, 3.5f)}},
+        {"exp", "exp(${T} (4.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {deFloatExp(4.2f)}},
+        {"log", "log(${T} (42.12))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {deFloatLog(42.12f)}},
+        {"exp2", "exp2(${T} (6.7))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {deFloatExp2(6.7f)}},
+        {"log2",
+         "log2(${T} (100.0))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_FLOAT,
+         {deFloatLog2(100.0f)}},
+        {"sqrt", "sqrt(${T} (10.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {deFloatSqrt(10.0f)}},
+        {"inversesqrt",
+         "inversesqrt(${T} (10.0))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_FLOAT,
+         {deFloatRsq(10.0f)}},
+        {"abs", "abs(${T} (-42))", glu::TYPE_INT, 1, 4, glu::TYPE_INT, {42}},
+        {"sign", "sign(${T} (-18.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {-1.0f}},
+        {"floor",
+         "floor(${T} (37.3))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_FLOAT,
+         {deFloatFloor(37.3f)}},
+        {"trunc", "trunc(${T} (-1.8))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {-1.0f}},
+        {"round", "round(${T} (42.1))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {42.0f}},
+        {"ceil", "ceil(${T} (82.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {deFloatCeil(82.2f)}},
+        {"mod",
+         "mod(${T} (87.65), ${MT} (3.7))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_FLOAT,
+         {deFloatMod(87.65f, 3.7f)}},
+        {"min", "min(${T} (12.3), ${MT} (32.1))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {12.3f}},
+        {"max", "max(${T} (12.3), ${MT} (32.1))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_FLOAT, {32.1f}},
+        {"clamp",
+         "clamp(${T} (42.1),    ${MT} (10.0), ${MT} (15.0))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_FLOAT,
+         {15.0f}},
+        {"length_float", "length(1.0)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, {1.0f}},
+        {"length_vec2",
+         "length(vec2(1.0))",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_FLOAT,
+         {deFloatSqrt(2.0f)}},
+        {"length_vec3",
+         "length(vec3(1.0))",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_FLOAT,
+         {deFloatSqrt(3.0f)}},
+        {"length_vec4",
+         "length(vec4(1.0))",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_FLOAT,
+         {deFloatSqrt(4.0f)}},
+        {"dot_float", "dot(1.0, 1.0)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, {1.0f}},
+        {"dot_vec2", "dot(vec2(1.0), vec2(1.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, {2.0f}},
+        {"dot_vec3", "dot(vec3(1.0), vec3(1.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, {3.0f}},
+        {"dot_vec4", "dot(vec4(1.0), vec4(1.0))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, {4.0f}},
+        {"normalize_float", "normalize(1.0)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_FLOAT, {1.0f}},
+        {"normalize_vec2",
+         "normalize(vec2(1.0)).x",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_FLOAT,
+         {deFloatRsq(2.0f)}},
+        {"normalize_vec3",
+         "normalize(vec3(1.0)).x",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_FLOAT,
+         {deFloatRsq(3.0f)}},
+        {"normalize_vec4",
+         "normalize(vec4(1.0)).x",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_FLOAT,
+         {deFloatRsq(4.0f)}},
+    };
+
+    const ShaderConstExpr::TestParams arrayCases[] = {
+        {"radians",
+         "radians(${T} (60.0))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {deFloatRadians(60.0f)}},
+        {"degrees",
+         "degrees(${T} (0.11))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {deFloatDegrees(0.11f)}},
+        {"sin",
+         "${T} (1.0) + sin(${T} (0.7))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {1.0f + deFloatSin(0.7f)}},
+        {"cos",
+         "${T} (1.0) + cos(${T} (0.7))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {1.0f + deFloatCos(0.7f)}},
+        {"asin", "asin(${T} (0.9))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatAsin(0.9f)}},
+        {"acos", "acos(${T} (-0.5))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatAcos(-0.5f)}},
+        {"pow",
+         "pow(${T} (2.0), ${T} (2.0))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {deFloatPow(2.0f, 2.0f)}},
+        {"exp", "exp(${T} (1.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatExp(1.2f)}},
+        {"log", "log(${T} (8.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatLog(8.0f)}},
+        {"exp2", "exp2(${T} (2.1))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatExp2(2.1f)}},
+        {"log2", "log2(${T} (9.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatLog2(9.0)}},
+        {"sqrt", "sqrt(${T} (4.5))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatSqrt(4.5f)}},
+        {"inversesqrt",
+         "inversesqrt(${T} (0.26))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {deFloatRsq(0.26f)}},
+        {"abs", "abs(${T} (-2))", glu::TYPE_INT, 1, 4, glu::TYPE_INT, {2}},
+        {"sign", "sign(${T} (18.0))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatSign(18.0f)}},
+        {"floor", "floor(${T} (3.3))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatFloor(3.3f)}},
+        {"trunc", "trunc(${T} (2.8))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {2}},
+        {"round", "round(${T} (2.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatRound(2.2f)}},
+        {"ceil", "ceil(${T} (2.2))", glu::TYPE_FLOAT, 1, 4, glu::TYPE_INT, {deFloatCeil(2.2f)}},
+        {"mod",
+         "mod(${T} (7.1), ${MT} (4.0))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {deFloatMod(7.1f, 4.0f)}},
+        {"min",
+         "min(${T} (2.3), ${MT} (3.1))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {deFloatMin(2.3f, 3.1f)}},
+        {"max",
+         "max(${T} (2.3), ${MT} (3.1))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {deFloatMax(2.3f, 3.1f)}},
+        {"clamp",
+         "clamp(${T} (4.1), ${MT} (2.1), ${MT} (3.1))",
+         glu::TYPE_FLOAT,
+         1,
+         4,
+         glu::TYPE_INT,
+         {3}},
+        {"length_float", "length(2.1)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_INT, {2}},
+        {"length_vec2",
+         "length(vec2(1.0))",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_INT,
+         {deFloatSqrt(2.0f)}},
+        {"length_vec3",
+         "length(vec3(1.0))",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_INT,
+         {deFloatSqrt(3.0f)}},
+        {"length_vec4",
+         "length(vec4(1.0))",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_INT,
+         {deFloatSqrt(4.0f)}},
+        {"dot_float", "dot(1.0, 1.0)", glu::TYPE_FLOAT, 1, 1, glu::TYPE_INT, {1}},
+        {"dot_vec2", "dot(vec2(1.0), vec2(1.01))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_INT, {2}},
+        {"dot_vec3", "dot(vec3(1.0), vec3(1.1))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_INT, {3}},
+        {"dot_vec4", "dot(vec4(1.0), vec4(1.1))", glu::TYPE_FLOAT, 1, 1, glu::TYPE_INT, {4}},
+        {"normalize_float",
+         "${T} (1.0) + normalize(2.0)",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_INT,
+         {2}},
+        {"normalize_vec2",
+         "${T} (1.0) + normalize(vec2(1.0)).x",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_INT,
+         {1.0f + deFloatRsq(2.0f)}},
+        {"normalize_vec3",
+         "${T} (1.0) + normalize(vec3(1.0)).x",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_INT,
+         {1.0f + deFloatRsq(3.0f)}},
+        {"normalize_vec4",
+         "${T} (1.0) + normalize(vec4(1.0)).x",
+         glu::TYPE_FLOAT,
+         1,
+         1,
+         glu::TYPE_INT,
+         {1.0f + deFloatRsq(4.0f)}},
+    };
+
+    const char *basicShaderTemplate =
+        "const ${CASE_BASE_TYPE} cval = ${CASE_EXPRESSION};\n"
+        "out0 = cval;\n";
+
+    std::vector<tcu::TestNode *> children;
+    ShaderConstExpr::createTests(m_context, baseCases, DE_LENGTH_OF_ARRAY(baseCases),
+                                 basicShaderTemplate, "basic_", children);
+
+    const char *arrayShaderTemplate =
+        "float array[int(${CASE_EXPRESSION})];\n"
+        "out0 = array.length();\n";
+
+    ShaderConstExpr::createTests(m_context, arrayCases, DE_LENGTH_OF_ARRAY(arrayCases),
+                                 arrayShaderTemplate, "array_", children);
+
+    for (std::size_t i = 0; i < children.size(); i++)
+        addChild(children[i]);
+}
+
+}  // namespace glcts
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/glcShaderMacroTests_override.cpp b/Source/ThirdParty/ANGLE/src/tests/deqp_support/glcShaderMacroTests_override.cpp
new file mode 100644
index 0000000..739cba6
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/glcShaderMacroTests_override.cpp
@@ -0,0 +1,147 @@
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * 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.
+ *
+ */ /*!
+ * \file
+ * \brief
+ */ /*-------------------------------------------------------------------*/
+
+#include "deSharedPtr.hpp"
+#include "glcShaderMacroTests.hpp"
+#include "glsShaderExecUtil.hpp"
+#include "gluContextInfo.hpp"
+#include "tcuTestLog.hpp"
+
+namespace glcts
+{
+
+using tcu::TestLog;
+using namespace deqp::gls::ShaderExecUtil;
+
+class ExecutorTestCase : public deqp::TestCase
+{
+  public:
+    ExecutorTestCase(deqp::Context &context,
+                     const char *name,
+                     glu::ShaderType shaderType,
+                     const ShaderSpec &shaderSpec,
+                     int expectedOutput);
+    virtual ~ExecutorTestCase(void);
+    virtual tcu::TestNode::IterateResult iterate(void);
+
+  protected:
+    glu::ShaderType m_shaderType;
+    ShaderSpec m_shaderSpec;
+    int m_expectedOutput;
+};
+
+ExecutorTestCase::ExecutorTestCase(deqp::Context &context,
+                                   const char *name,
+                                   glu::ShaderType shaderType,
+                                   const ShaderSpec &shaderSpec,
+                                   int expectedOutput)
+    : deqp::TestCase(context, name, ""),
+      m_shaderType(shaderType),
+      m_shaderSpec(shaderSpec),
+      m_expectedOutput(expectedOutput)
+{}
+
+ExecutorTestCase::~ExecutorTestCase(void) {}
+
+tcu::TestNode::IterateResult ExecutorTestCase::iterate(void)
+{
+    de::SharedPtr<ShaderExecutor> executor(
+        createExecutor(m_context.getRenderContext(), m_shaderType, m_shaderSpec));
+
+    DE_ASSERT(executor.get());
+
+    executor->log(m_context.getTestContext().getLog());
+
+    if (!executor->isOk())
+        TCU_FAIL("Compilation failed");
+
+    executor->useProgram();
+
+    int result          = 0;
+    void *const outputs = &result;
+    executor->execute(1, DE_NULL, &outputs);
+
+    if (m_expectedOutput == result)
+    {
+        m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
+        return tcu::TestNode::STOP;
+    }
+
+    m_context.getTestContext().getLog()
+        << tcu::TestLog::Message << "Expected: " << m_expectedOutput
+        << " but test returned: " << result << tcu::TestLog::EndMessage;
+    m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
+
+    return tcu::TestNode::STOP;
+}
+
+ShaderMacroTests::ShaderMacroTests(deqp::Context &context)
+    : TestCaseGroup(context, "shader_macros", "Shader Macro tests")
+{}
+
+ShaderMacroTests::~ShaderMacroTests() {}
+
+void ShaderMacroTests::init(void)
+{
+    const char *fragmentPrecisionShaderTemplate =
+        "out0 = 0;\n"
+        "#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
+        "out0 = 1;\n"
+        "#endif\n";
+
+    glu::ContextType contextType = m_context.getRenderContext().getType();
+
+    ShaderSpec shaderSpec;
+    shaderSpec.version = glu::getContextTypeGLSLVersion(contextType);
+    shaderSpec.source  = fragmentPrecisionShaderTemplate;
+    shaderSpec.outputs.push_back(Symbol("out0", glu::VarType(glu::TYPE_INT, glu::PRECISION_HIGHP)));
+
+    std::vector<glu::ShaderType> shaderTypes;
+    shaderTypes.push_back(glu::SHADERTYPE_VERTEX);
+    shaderTypes.push_back(glu::SHADERTYPE_FRAGMENT);
+
+    if (glu::contextSupports(contextType, glu::ApiType::es(3, 2)))
+    {
+        shaderSpec.version = glu::GLSL_VERSION_320_ES;
+        shaderTypes.push_back(glu::SHADERTYPE_GEOMETRY);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_CONTROL);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_EVALUATION);
+    }
+    else if (glu::contextSupports(contextType, glu::ApiType::es(3, 1)))
+    {
+        shaderSpec.version = glu::GLSL_VERSION_310_ES;
+        shaderTypes.push_back(glu::SHADERTYPE_GEOMETRY);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_CONTROL);
+        shaderTypes.push_back(glu::SHADERTYPE_TESSELLATION_EVALUATION);
+    }
+
+    for (std::size_t typeIndex = 0; typeIndex < shaderTypes.size(); ++typeIndex)
+    {
+        glu::ShaderType shaderType = shaderTypes[typeIndex];
+        std::string caseName("fragment_precision_high_");
+        caseName += getShaderTypeName(shaderType);
+        addChild(new ExecutorTestCase(m_context, caseName.c_str(), shaderType, shaderSpec, 1));
+    }
+}
+
+}  // namespace glcts
diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/tes31Context_override.cpp b/Source/ThirdParty/ANGLE/src/tests/deqp_support/tes31Context_override.cpp
index 89bd1d8..f9d459d 100644
--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/tes31Context_override.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/tes31Context_override.cpp
@@ -24,17 +24,17 @@
 {
 
 Context::Context (tcu::TestContext& testCtx)
-    : m_testCtx        (testCtx)
-    , m_renderCtx    (DE_NULL)
-    , m_contextInfo    (DE_NULL)
+    : m_testCtx     (testCtx)
+    , m_renderCtx   (DE_NULL)
+    , m_contextInfo (DE_NULL)
 {
     if (m_testCtx.getCommandLine().getRunMode() == tcu::RUNMODE_EXECUTE)
         createRenderContext();
     else
     {
         // \todo [2016-11-15 pyry] Many tests (erroneously) inspect context type
-        //                           during test hierarchy construction. We should fix that
-        //                           and revert dummy context to advertise unknown context type.
+        //                         during test hierarchy construction. We should fix that
+        //                         and revert dummy context to advertise unknown context type.
         m_renderCtx = new glu::DummyRenderContext(glu::ContextType(glu::ApiType::es(3,1)));
     }
 }
@@ -57,17 +57,17 @@
 #if 0
         try
         {
-            m_renderCtx        = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 2));
+            m_renderCtx     = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 2));
         }
         catch (...)
         {
-            m_renderCtx        = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 1));
+            m_renderCtx     = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 1));
         }
 #else
         // Override the original behavior (above) to only create a 3.1 context
-        m_renderCtx        = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 1));
+        m_renderCtx     = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 1));
 #endif
-        m_contextInfo    = glu::ContextInfo::create(*m_renderCtx);
+        m_contextInfo   = glu::ContextInfo::create(*m_renderCtx);
     }
     catch (...)
     {
@@ -81,8 +81,8 @@
     delete m_contextInfo;
     delete m_renderCtx;
 
-    m_contextInfo    = DE_NULL;
-    m_renderCtx        = DE_NULL;
+    m_contextInfo   = DE_NULL;
+    m_renderCtx     = DE_NULL;
 }
 
 const tcu::RenderTarget& Context::getRenderTarget (void) const
@@ -93,4 +93,4 @@
 } // gles31
 } // deqp
 
-// clang-format on
+// clang-format on
\ No newline at end of file
diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLBackwardsCompatibleContextTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLBackwardsCompatibleContextTest.cpp
index e784921..e2a899a 100644
--- a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLBackwardsCompatibleContextTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLBackwardsCompatibleContextTest.cpp
@@ -133,8 +133,6 @@
 {
     ANGLE_SKIP_TEST_IF(
         !IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANGLE_create_context_backwards_compatible"));
-    // TODO(anglebug.com/3750): Re-evaluate when Vulkan can return 3.0 contexts
-    ANGLE_SKIP_TEST_IF(isVulkanRenderer());
 
     EGLint es3ContextAttribs[] = {
         EGL_CONTEXT_MAJOR_VERSION, 3, EGL_CONTEXT_MINOR_VERSION, 0, EGL_NONE, EGL_NONE};
diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLBlobCacheTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLBlobCacheTest.cpp
index 90912e1..0f376ce 100644
--- a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLBlobCacheTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLBlobCacheTest.cpp
@@ -214,4 +214,4 @@
     EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
 }
 
-ANGLE_INSTANTIATE_TEST(EGLBlobCacheTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(EGLBlobCacheTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLContextSharingTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLContextSharingTest.cpp
index 16bdc44..2e80366 100644
--- a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLContextSharingTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLContextSharingTest.cpp
@@ -10,6 +10,7 @@
 
 #include "test_utils/ANGLETest.h"
 #include "test_utils/angle_test_configs.h"
+#include "test_utils/gl_raii.h"
 #include "util/EGLWindow.h"
 
 using namespace angle;
@@ -243,6 +244,126 @@
     ASSERT_GL_FALSE(glIsTexture(textureFromCtx0));
 }
 
+// Tests that deleting an object on one Context doesn't destroy it ahead-of-time. Mostly focused
+// on the Vulkan back-end where we manage object lifetime manually.
+TEST_P(EGLContextSharingTest, TextureLifetime)
+{
+    EGLWindow *eglWindow = getEGLWindow();
+    EGLConfig config     = getEGLWindow()->getConfig();
+    EGLDisplay display   = getEGLWindow()->getDisplay();
+
+    // Create a pbuffer surface for use with a shared context.
+    EGLSurface surface     = eglWindow->getSurface();
+    EGLContext mainContext = eglWindow->getContext();
+
+    // Initialize a shared context.
+    mContexts[0] = eglCreateContext(display, config, mainContext, nullptr);
+    ASSERT_NE(mContexts[0], EGL_NO_CONTEXT);
+
+    // Create a Texture on the shared context.
+    ASSERT_EGL_TRUE(eglMakeCurrent(display, surface, surface, mContexts[0]));
+
+    constexpr GLsizei kTexSize                  = 2;
+    const GLColor kTexData[kTexSize * kTexSize] = {GLColor::red, GLColor::green, GLColor::blue,
+                                                   GLColor::yellow};
+    GLTexture tex;
+    glBindTexture(GL_TEXTURE_2D, tex);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexSize, kTexSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                 kTexData);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+    // Make the main Context current and draw with the texture.
+    ASSERT_EGL_TRUE(eglMakeCurrent(display, surface, surface, mainContext));
+
+    glBindTexture(GL_TEXTURE_2D, tex);
+    ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
+    glUseProgram(program);
+
+    // No uniform update because the update seems to hide the error on Vulkan.
+
+    // Enqueue the draw call.
+    drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
+    EXPECT_GL_NO_ERROR();
+
+    // Delete the texture in the main context to orphan it.
+    // Do not read back the data to keep the commands in the graph.
+    tex.reset();
+
+    // Bind and delete the test context. This should trigger texture garbage collection.
+    ASSERT_EGL_TRUE(eglMakeCurrent(display, surface, surface, mContexts[0]));
+    SafeDestroyContext(display, mContexts[0]);
+
+    // Bind the main context to clean up the test.
+    ASSERT_EGL_TRUE(eglMakeCurrent(display, surface, surface, mainContext));
+}
+
+// Tests that deleting an object on one Context doesn't destroy it ahead-of-time. Mostly focused
+// on the Vulkan back-end where we manage object lifetime manually.
+TEST_P(EGLContextSharingTest, SamplerLifetime)
+{
+    EGLWindow *eglWindow = getEGLWindow();
+    EGLConfig config     = getEGLWindow()->getConfig();
+    EGLDisplay display   = getEGLWindow()->getDisplay();
+
+    ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
+    ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(display, "EGL_KHR_create_context"));
+
+    // Create a pbuffer surface for use with a shared context.
+    EGLSurface surface     = eglWindow->getSurface();
+    EGLContext mainContext = eglWindow->getContext();
+
+    std::vector<EGLint> contextAttributes;
+    contextAttributes.push_back(EGL_CONTEXT_MAJOR_VERSION_KHR);
+    contextAttributes.push_back(getClientMajorVersion());
+    contextAttributes.push_back(EGL_NONE);
+
+    // Initialize a shared context.
+    mContexts[0] = eglCreateContext(display, config, mainContext, contextAttributes.data());
+    ASSERT_NE(mContexts[0], EGL_NO_CONTEXT);
+
+    // Create a Texture on the shared context. Also create a Sampler object.
+    ASSERT_EGL_TRUE(eglMakeCurrent(display, surface, surface, mContexts[0]));
+
+    constexpr GLsizei kTexSize                  = 2;
+    const GLColor kTexData[kTexSize * kTexSize] = {GLColor::red, GLColor::green, GLColor::blue,
+                                                   GLColor::yellow};
+    GLTexture tex;
+    glBindTexture(GL_TEXTURE_2D, tex);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexSize, kTexSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                 kTexData);
+
+    GLSampler sampler;
+    glBindSampler(0, sampler);
+    glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+    // Make the main Context current and draw with the texture and sampler.
+    ASSERT_EGL_TRUE(eglMakeCurrent(display, surface, surface, mainContext));
+
+    glBindTexture(GL_TEXTURE_2D, tex);
+    glBindSampler(0, sampler);
+    ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
+    glUseProgram(program);
+
+    // No uniform update because the update seems to hide the error on Vulkan.
+
+    // Enqueue the draw call.
+    drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
+    EXPECT_GL_NO_ERROR();
+
+    // Delete the texture and sampler in the main context to orphan them.
+    // Do not read back the data to keep the commands in the graph.
+    tex.reset();
+    sampler.reset();
+
+    // Bind and delete the test context. This should trigger texture garbage collection.
+    ASSERT_EGL_TRUE(eglMakeCurrent(display, surface, surface, mContexts[0]));
+    SafeDestroyContext(display, mContexts[0]);
+
+    // Bind the main context to clean up the test.
+    ASSERT_EGL_TRUE(eglMakeCurrent(display, surface, surface, mainContext));
+}
 }  // anonymous namespace
 
 ANGLE_INSTANTIATE_TEST(EGLContextSharingTest,
@@ -251,4 +372,5 @@
                        ES3_D3D11(),
                        ES2_OPENGL(),
                        ES3_OPENGL(),
-                       ES2_VULKAN());
+                       ES2_VULKAN(),
+                       ES3_VULKAN());
diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp
new file mode 100644
index 0000000..51f6245
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp
@@ -0,0 +1,474 @@
+//
+// 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.
+//
+// EGLPrintEGLinfoTest.cpp:
+//   This test prints out the extension strings, configs and their attributes
+//
+
+#include <gtest/gtest.h>
+
+#include "common/string_utils.h"
+#include "test_utils/ANGLETest.h"
+
+using namespace angle;
+
+class EGLPrintEGLinfoTest : public ANGLETest
+{
+  protected:
+    EGLPrintEGLinfoTest() {}
+
+    void testSetUp() override
+    {
+        mDisplay = getEGLWindow()->getDisplay();
+        ASSERT_TRUE(mDisplay != EGL_NO_DISPLAY);
+    }
+
+    EGLDisplay mDisplay = EGL_NO_DISPLAY;
+};
+
+// Parse space separated extension string into a vector of strings
+std::vector<std::string> ParseExtensions(const char *extensions)
+{
+    std::string extensionsStr(extensions);
+    std::vector<std::string> extensionsVec;
+    SplitStringAlongWhitespace(extensionsStr, &extensionsVec);
+    return extensionsVec;
+}
+
+// Query a EGL attribute
+EGLint GetAttrib(EGLDisplay display, EGLConfig config, EGLint attrib)
+{
+    EGLint value = 0;
+    EXPECT_EGL_TRUE(eglGetConfigAttrib(display, config, attrib, &value));
+    return value;
+}
+
+// Query a egl string
+const char *GetEGLString(EGLDisplay display, EGLint name)
+{
+    const char *value = "";
+    value             = eglQueryString(display, name);
+    EXPECT_TRUE(value != nullptr);
+    return value;
+}
+
+// Query a GL string
+const char *GetGLString(EGLint name)
+{
+    const char *value = "";
+    value             = reinterpret_cast<const char *>(glGetString(name));
+    EXPECT_TRUE(value != nullptr);
+    return value;
+}
+
+// Print the EGL strings and extensions
+TEST_P(EGLPrintEGLinfoTest, PrintEGLInfo)
+{
+    std::cout << "    EGL Information:" << std::endl;
+    std::cout << "\tVendor: " << GetEGLString(mDisplay, EGL_VENDOR) << std::endl;
+    std::cout << "\tVersion: " << GetEGLString(mDisplay, EGL_VENDOR) << std::endl;
+    std::cout << "\tClient APIs: " << GetEGLString(mDisplay, EGL_CLIENT_APIS) << std::endl;
+
+    std::cout << "\tEGL Client Extensions:" << std::endl;
+    for (auto extension : ParseExtensions(GetEGLString(EGL_NO_DISPLAY, EGL_EXTENSIONS)))
+    {
+        std::cout << "\t\t" << extension << std::endl;
+    }
+
+    std::cout << "\tEGL Display Extensions:" << std::endl;
+    for (auto extension : ParseExtensions(GetEGLString(mDisplay, EGL_EXTENSIONS)))
+    {
+        std::cout << "\t\t" << extension << std::endl;
+    }
+
+    std::cout << std::endl;
+}
+
+// Print the GL strings and extensions
+TEST_P(EGLPrintEGLinfoTest, PrintGLInfo)
+{
+    std::cout << "    GLES Information:" << std::endl;
+    std::cout << "\tVendor: " << GetGLString(GL_VENDOR) << std::endl;
+    std::cout << "\tVersion: " << GetGLString(GL_VERSION) << std::endl;
+    std::cout << "\tRenderer: " << GetGLString(GL_RENDERER) << std::endl;
+    std::cout << "\tShader: " << GetGLString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
+
+    std::cout << "\tExtensions:" << std::endl;
+    for (auto extension : ParseExtensions(GetGLString(GL_EXTENSIONS)))
+    {
+        std::cout << "\t\t" << extension << std::endl;
+    }
+
+    std::cout << std::endl;
+}
+
+#define QUERY_HELPER(enumValue, enumString, stream)                                    \
+    {                                                                                  \
+        GLint result;                                                                  \
+        glGetIntegerv(enumValue, &result);                                             \
+        ASSERT_GL_NO_ERROR();                                                          \
+        stream << enumString + std::string(",") + std::to_string(result) << std::endl; \
+    }
+
+#define QUERY_ARRAY_HELPER(enumValue, enumString, size, stream)               \
+    {                                                                         \
+        GLint result[size];                                                   \
+        glGetIntegerv(enumValue, result);                                     \
+        ASSERT_GL_NO_ERROR();                                                 \
+        std::stringstream results;                                            \
+        for (int i = 0; i < size; i++)                                        \
+            results << result[i] << " ";                                      \
+        stream << enumString + std::string(",") + results.str() << std::endl; \
+    }
+
+#define QUERY_INDEXED_HELPER(enumValue, enumString, index, stream)                     \
+    {                                                                                  \
+        GLint result;                                                                  \
+        glGetIntegeri_v(enumValue, index, &result);                                    \
+        ASSERT_GL_NO_ERROR();                                                          \
+        stream << enumString + std::string(",") + std::to_string(result) << std::endl; \
+    }
+
+#define QUERY_AND_LOG_CAPABILITY(enum, stream) QUERY_HELPER(enum, #enum, stream)
+
+#define QUERY_AND_LOG_CAPABILITY_ARRAY(enum, size, stream) \
+    QUERY_ARRAY_HELPER(enum, #enum, size, stream)
+
+#define QUERY_AND_LOG_CAPABILITY_INDEXED(enum, index, stream) \
+    QUERY_INDEXED_HELPER(enum, #enum "[" #index "]", index, stream)
+
+static void LogGles2Capabilities(std::ostream &stream)
+{
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_CUBE_MAP_TEXTURE_SIZE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_UNIFORM_VECTORS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_RENDERBUFFER_SIZE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_IMAGE_UNITS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_SIZE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VARYING_VECTORS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIBS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_UNIFORM_VECTORS, stream);
+    constexpr int kMaxViewPortDimsReturnValuesSize = 2;
+    QUERY_AND_LOG_CAPABILITY_ARRAY(GL_MAX_VIEWPORT_DIMS, kMaxViewPortDimsReturnValuesSize, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_NUM_COMPRESSED_TEXTURE_FORMATS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_NUM_PROGRAM_BINARY_FORMATS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_NUM_SHADER_BINARY_FORMATS, stream);
+}
+
+static void LogGles3Capabilities(std::ostream &stream)
+{
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_3D_TEXTURE_SIZE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_ARRAY_TEXTURE_LAYERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COLOR_ATTACHMENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_UNIFORM_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_DRAW_BUFFERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_ELEMENT_INDEX, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_ELEMENTS_INDICES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_ELEMENTS_VERTICES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_INPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_PROGRAM_TEXEL_OFFSET, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_SAMPLES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_SERVER_WAIT_TIMEOUT, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_LOD_BIAS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_UNIFORM_BLOCK_SIZE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_UNIFORM_BUFFER_BINDINGS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VARYING_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_OUTPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_UNIFORM_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_UNIFORM_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MIN_PROGRAM_TEXEL_OFFSET, stream);
+
+    // GLES3 capabilities are a superset of GLES2
+    LogGles2Capabilities(stream);
+}
+
+static void LogGles31Capabilities(std::ostream &stream)
+{
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COLOR_TEXTURE_SAMPLES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_ATOMIC_COUNTERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_IMAGE_UNIFORMS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_ATOMIC_COUNTERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_IMAGE_UNIFORMS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_SHARED_MEMORY_SIZE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_UNIFORM_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_UNIFORM_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, stream);
+    QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, stream);
+    QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, stream);
+    QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, stream);
+    QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, stream);
+    QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_DEPTH_TEXTURE_SAMPLES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_ATOMIC_COUNTERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_HEIGHT, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_SAMPLES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_WIDTH, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_IMAGE_UNITS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_INTEGER_SAMPLES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_SAMPLE_MASK_WORDS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_UNIFORM_LOCATIONS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATOMIC_COUNTERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIB_BINDINGS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIB_STRIDE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_IMAGE_UNIFORMS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET, stream);
+
+    // GLES31 capabilities are a superset of GLES3
+    LogGles3Capabilities(stream);
+}
+
+static void LogGles32Capabilities(std::ostream &stream)
+{
+    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);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_DEBUG_GROUP_STACK_DEPTH, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_DEBUG_LOGGED_MESSAGES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_DEBUG_MESSAGE_LENGTH, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_INTERPOLATION_OFFSET, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_LAYERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_ATOMIC_COUNTERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_IMAGE_UNIFORMS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_INPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_OUTPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_OUTPUT_VERTICES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_SHADER_INVOCATIONS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_UNIFORM_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_UNIFORM_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_LABEL_LENGTH, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_PATCH_VERTICES, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_INPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_GEN_LEVEL, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_PATCH_COMPONENTS, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_BUFFER_SIZE, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MIN_FRAGMENT_INTERPOLATION_OFFSET, stream);
+    QUERY_AND_LOG_CAPABILITY(GL_MIN_SAMPLE_SHADING_VALUE, stream);
+
+    // GLES32 capabilities are a superset of GLES31
+    LogGles31Capabilities(stream);
+}
+
+// Prints GLES Capabilities listed at
+// https://opengles.gpuinfo.org/listcapabilities.php
+// in CSV format
+TEST_P(EGLPrintEGLinfoTest, PrintGLESCapabilities)
+{
+    std::cout << std::endl << "Capability name, value" << std::endl << std::endl;
+
+    std::ostream &stream = std::cout;
+
+    switch (getClientMajorVersion())
+    {
+        case 3:
+            switch (getClientMinorVersion())
+            {
+                case 2:
+                    LogGles32Capabilities(stream);
+                    break;
+                case 1:
+                    LogGles31Capabilities(stream);
+                    break;
+                case 0:
+                    LogGles3Capabilities(stream);
+                    break;
+                default:
+                    FAIL() << "unknown client minor version.";
+            }
+            break;
+        case 2:
+            LogGles2Capabilities(stream);
+            break;
+        default:
+            FAIL() << "unknown client major version.";
+    }
+
+    stream << std::endl;
+}
+
+// Print the EGL configs with attributes
+TEST_P(EGLPrintEGLinfoTest, PrintConfigInfo)
+{
+    // Get all the configs
+    EGLint count;
+    EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, nullptr, 0, &count));
+    EXPECT_TRUE(count > 0);
+    std::vector<EGLConfig> configs(count);
+    EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, configs.data(), count, &count));
+    configs.resize(count);
+    // sort configs by increaing ID
+    std::sort(configs.begin(), configs.end(), [this](EGLConfig a, EGLConfig b) -> bool {
+        return GetAttrib(mDisplay, a, EGL_CONFIG_ID) < GetAttrib(mDisplay, b, EGL_CONFIG_ID);
+    });
+
+    std::cout << "Configs - Count: " << count << std::endl;
+
+    // For each config, print its attributes
+    for (auto config : configs)
+    {
+        // Config ID
+        std::cout << "    Config: " << GetAttrib(mDisplay, config, EGL_CONFIG_ID) << std::endl;
+
+        // Color
+        const char *componentType = (GetAttrib(mDisplay, config, EGL_COLOR_COMPONENT_TYPE_EXT) ==
+                                     EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT)
+                                        ? "Float "
+                                        : "Fixed ";
+        const char *colorBuffType =
+            (GetAttrib(mDisplay, config, EGL_COLOR_BUFFER_TYPE) == EGL_LUMINANCE_BUFFER)
+                ? "LUMINANCE"
+                : "RGB";
+        std::cout << "\tColor:" << GetAttrib(mDisplay, config, EGL_BUFFER_SIZE) << "bit "
+                  << componentType << colorBuffType
+                  << " Red:" << GetAttrib(mDisplay, config, EGL_RED_SIZE)
+                  << " Green:" << GetAttrib(mDisplay, config, EGL_GREEN_SIZE)
+                  << " Blue:" << GetAttrib(mDisplay, config, EGL_BLUE_SIZE)
+                  << " Alpha:" << GetAttrib(mDisplay, config, EGL_ALPHA_SIZE)
+                  << " Lum:" << GetAttrib(mDisplay, config, EGL_LUMINANCE_SIZE)
+                  << " AlphaMask:" << GetAttrib(mDisplay, config, EGL_ALPHA_MASK_SIZE) << std::endl;
+
+        // Texture Binding
+        std::cout << "\tBinding RGB:" << (bool)GetAttrib(mDisplay, config, EGL_BIND_TO_TEXTURE_RGB)
+                  << " RGBA:" << (bool)GetAttrib(mDisplay, config, EGL_BIND_TO_TEXTURE_RGBA)
+                  << " MaxWidth:" << GetAttrib(mDisplay, config, EGL_MAX_PBUFFER_WIDTH)
+                  << " MaxHeight:" << GetAttrib(mDisplay, config, EGL_MAX_PBUFFER_HEIGHT)
+                  << " MaxPixels:" << GetAttrib(mDisplay, config, EGL_MAX_PBUFFER_PIXELS)
+                  << std::endl;
+
+        // Conformant
+        EGLint caveatAttrib = GetAttrib(mDisplay, config, EGL_CONFIG_CAVEAT);
+        const char *caveat  = nullptr;
+        switch (caveatAttrib)
+        {
+            case EGL_NONE:
+                caveat = "None.";
+                break;
+            case EGL_SLOW_CONFIG:
+                caveat = "Slow.";
+                break;
+            case EGL_NON_CONFORMANT_CONFIG:
+                caveat = "Non-Conformant.";
+                break;
+            default:
+                caveat = ".";
+        }
+        std::cout << "\tCaveate: " << caveat;
+
+        EGLint conformant = GetAttrib(mDisplay, config, EGL_CONFORMANT);
+        std::cout << " Conformant: ";
+        if (conformant & EGL_OPENGL_BIT)
+            std::cout << "OpenGL ";
+        if (conformant & EGL_OPENGL_ES_BIT)
+            std::cout << "ES1 ";
+        if (conformant & EGL_OPENGL_ES2_BIT)
+            std::cout << "ES2 ";
+        if (conformant & EGL_OPENGL_ES3_BIT)
+            std::cout << "ES3";
+        std::cout << std::endl;
+
+        // Ancilary buffers
+        std::cout << "\tAncilary "
+                  << "Depth:" << GetAttrib(mDisplay, config, EGL_DEPTH_SIZE)
+                  << " Stencil:" << GetAttrib(mDisplay, config, EGL_STENCIL_SIZE)
+                  << " SampleBuffs:" << GetAttrib(mDisplay, config, EGL_SAMPLE_BUFFERS)
+                  << " Samples:" << GetAttrib(mDisplay, config, EGL_SAMPLES) << std::endl;
+
+        // Swap interval
+        std::cout << "\tSwap Interval"
+                  << " Min:" << GetAttrib(mDisplay, config, EGL_MIN_SWAP_INTERVAL)
+                  << " Max:" << GetAttrib(mDisplay, config, EGL_MAX_SWAP_INTERVAL) << std::endl;
+
+        // Native
+        std::cout << "\tNative Renderable: " << GetAttrib(mDisplay, config, EGL_NATIVE_RENDERABLE)
+                  << ", VisualID: " << GetAttrib(mDisplay, config, EGL_NATIVE_VISUAL_ID)
+                  << ", VisualType: " << GetAttrib(mDisplay, config, EGL_NATIVE_VISUAL_TYPE)
+                  << std::endl;
+
+        // Surface type
+        EGLint surfaceType = GetAttrib(mDisplay, config, EGL_SURFACE_TYPE);
+        std::cout << "\tSurface Type: ";
+        if (surfaceType & EGL_WINDOW_BIT)
+            std::cout << "WINDOW ";
+        if (surfaceType & EGL_PIXMAP_BIT)
+            std::cout << "PIXMAP ";
+        if (surfaceType & EGL_PBUFFER_BIT)
+            std::cout << "PBUFFER ";
+        if (surfaceType & EGL_MULTISAMPLE_RESOLVE_BOX_BIT)
+            std::cout << "MULTISAMPLE_RESOLVE_BOX ";
+        if (surfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)
+            std::cout << "SWAP_PRESERVE ";
+        std::cout << std::endl;
+
+        // Renderable
+        EGLint rendType = GetAttrib(mDisplay, config, EGL_RENDERABLE_TYPE);
+        std::cout << "\tRender: ";
+        if (rendType & EGL_OPENGL_BIT)
+            std::cout << "OpenGL ";
+        if (rendType & EGL_OPENGL_ES_BIT)
+            std::cout << "ES1 ";
+        if (rendType & EGL_OPENGL_ES2_BIT)
+            std::cout << "ES2 ";
+        if (rendType & EGL_OPENGL_ES3_BIT)
+            std::cout << "ES3 ";
+        std::cout << std::endl;
+
+        // Extensions
+        std::cout << "\tAndroid Recordable: " << GetAttrib(mDisplay, config, EGL_RECORDABLE_ANDROID)
+                  << std::endl;
+
+        // Separator between configs
+        std::cout << std::endl;
+    }
+}
+
+ANGLE_INSTANTIATE_TEST(EGLPrintEGLinfoTest, ES2_VULKAN(), ES3_VULKAN());
diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLRecordableTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLRecordableTest.cpp
index 60fcc03..3d8f90d 100644
--- a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLRecordableTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLRecordableTest.cpp
@@ -63,4 +63,4 @@
 
 }  // namespace angle
 
-ANGLE_INSTANTIATE_TEST(EGLRecordableTest, ES2_D3D11(), ES2_OPENGL(), ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(EGLRecordableTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLStreamTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLStreamTest.cpp
index 66021a8..3c7d7c9 100644
--- a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLStreamTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLStreamTest.cpp
@@ -836,5 +836,5 @@
                        ES2_OPENGL(),
                        ES3_OPENGL(),
                        ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(D3D11TextureStreamSamplingTest, ES2_D3D11(), ES3_D3D11());
+ANGLE_INSTANTIATE_TEST(D3D11TextureStreamSamplingTest, ES2_D3D11(), ES3_D3D11(), ES31_D3D11());
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/AtomicCounterBufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/AtomicCounterBufferTest.cpp
index 928a30f..899eac3 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/AtomicCounterBufferTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/AtomicCounterBufferTest.cpp
@@ -437,7 +437,10 @@
 // is with WGL where if a Vulkan test is run first in the shard, it causes crashes when an OpenGL
 // test is run afterwards.  AtomicCounter* tests are alphabetically first, and having them not run
 // on Vulkan makes every shard our bots currently make do have at least some OpenGL test run before
-// any Vulkan test.
+// any Vulkan test. When these tests can be enabled on Vulkan, can replace the current macros with
+// the updated macros below that include Vulkan:
+// ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(AtomicCounterBufferTest);
+// ANGLE_INSTANTIATE_TEST_ES31(AtomicCounterBufferTest31);
 ANGLE_INSTANTIATE_TEST(AtomicCounterBufferTest,
                        ES3_OPENGL(),
                        ES3_OPENGLES(),
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/AttributeLayoutTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/AttributeLayoutTest.cpp
index 22a5602..441a5f6 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/AttributeLayoutTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/AttributeLayoutTest.cpp
@@ -473,12 +473,8 @@
     Run(false);
 }
 
-#define PARAMS                                                                         \
-    ES2_VULKAN(), ES2_OPENGL(), ES2_D3D9(), ES2_D3D11(), ES3_OPENGL(), ES2_OPENGLES(), \
-        ES3_OPENGLES(), ES3_VULKAN()
-
-ANGLE_INSTANTIATE_TEST(AttributeLayoutNonIndexed, PARAMS);
-ANGLE_INSTANTIATE_TEST(AttributeLayoutMemoryIndexed, PARAMS);
-ANGLE_INSTANTIATE_TEST(AttributeLayoutBufferIndexed, PARAMS);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(AttributeLayoutNonIndexed);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(AttributeLayoutMemoryIndexed);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(AttributeLayoutBufferIndexed);
 
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BPTCCompressedTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BPTCCompressedTextureTest.cpp
index 9d71e5a..28f42bb 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BPTCCompressedTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BPTCCompressedTextureTest.cpp
@@ -367,14 +367,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(BPTCCompressedTextureTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(BPTCCompressedTextureTest);
 
-ANGLE_INSTANTIATE_TEST(BPTCCompressedTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3(BPTCCompressedTextureTestES3);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BindGeneratesResourceTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BindGeneratesResourceTest.cpp
index e2582eb..ab58734 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BindGeneratesResourceTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BindGeneratesResourceTest.cpp
@@ -110,14 +110,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(BindGeneratesResourceTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(BindGeneratesResourceTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BindUniformLocationTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BindUniformLocationTest.cpp
index 3fb0537..eabb2ac 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BindUniformLocationTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BindUniformLocationTest.cpp
@@ -535,13 +535,8 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(BindUniformLocationTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(BindUniformLocationTest);
 
-ANGLE_INSTANTIATE_TEST(BindUniformLocationES31Test, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES31(BindUniformLocationES31Test);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlendFuncExtendedTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlendFuncExtendedTest.cpp
index f06052b..4220eb9 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlendFuncExtendedTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlendFuncExtendedTest.cpp
@@ -707,29 +707,8 @@
     glDeleteProgram(program);
 }
 
-ANGLE_INSTANTIATE_TEST(EXTBlendFuncExtendedTest,
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(EXTBlendFuncExtendedTestES3,
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES(),
-                       ES3_VULKAN(),
-                       ES31_VULKAN());
-ANGLE_INSTANTIATE_TEST(EXTBlendFuncExtendedDrawTest,
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(EXTBlendFuncExtendedDrawTestES3,
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES(),
-                       ES3_VULKAN(),
-                       ES31_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(EXTBlendFuncExtendedTest);
+ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(EXTBlendFuncExtendedTestES3);
+
+ANGLE_INSTANTIATE_TEST_ES2(EXTBlendFuncExtendedDrawTest);
+ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(EXTBlendFuncExtendedDrawTestES3);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlendMinMaxTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlendMinMaxTest.cpp
index a2f01bc..a01389e 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlendMinMaxTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlendMinMaxTest.cpp
@@ -102,7 +102,16 @@
                 {
                     EXPECT_NEAR(
                         getExpected(blendMin, color.values[componentIdx], prevColor[componentIdx]),
-                        pixel[componentIdx], errorRange);
+                        pixel[componentIdx], errorRange)
+                        << " blendMin=" << blendMin << " componentIdx=" << componentIdx << std::endl
+                        << " color.values[0]=" << color.values[0]
+                        << " prevColor[0]=" << prevColor[0] << std::endl
+                        << " color.values[1]=" << color.values[1]
+                        << " prevColor[1]=" << prevColor[1] << std::endl
+                        << " color.values[2]=" << color.values[2]
+                        << " prevColor[2]=" << prevColor[2] << std::endl
+                        << " color.values[3]=" << color.values[3]
+                        << " prevColor[3]=" << prevColor[3];
                 }
             }
 
@@ -181,18 +190,12 @@
 {
     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
                        !IsGLExtensionEnabled("GL_EXT_color_buffer_half_float"));
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
 
     runTest(GL_RGBA16F, GL_FLOAT);
 }
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(BlendMinMaxTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(BlendMinMaxTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
index a4158ff..4f0d60e 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
@@ -1223,6 +1223,9 @@
     // clearDepth && !maskDepth fails on Intel Ubuntu 19.04 Mesa 19.0.2 GL. http://anglebug.com/3614
     ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsDesktopOpenGL());
 
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+
     GLRenderbuffer depthMS;
     glBindRenderbuffer(GL_RENDERBUFFER, depthMS.get());
     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
@@ -2000,4 +2003,4 @@
                        ES2_VULKAN(),
                        ES3_VULKAN());
 
-ANGLE_INSTANTIATE_TEST(BlitFramebufferTest, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(BlitFramebufferTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BufferDataTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BufferDataTest.cpp
index 3e63fca..9a6782b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BufferDataTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BufferDataTest.cpp
@@ -292,6 +292,8 @@
 // https://code.google.com/p/angleproject/issues/detail?id=709
 TEST_P(IndexedBufferCopyTest, IndexRangeBug)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(geofflang): Figure out why this fails on AMD OpenGL (http://anglebug.com/1291)
     ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
 
@@ -538,18 +540,9 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(BufferDataTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(BufferDataTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(IndexedBufferCopyTest,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(BufferDataTest);
+ANGLE_INSTANTIATE_TEST_ES3(BufferDataTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(IndexedBufferCopyTest);
 
 #ifdef _WIN64
 
@@ -568,6 +561,8 @@
 {
     // http://anglebug.com/3786: flaky timeout on Win10 FYI x64 Release (NVIDIA GeForce GTX 1660)
     ANGLE_SKIP_TEST_IF(IsWindows() && IsNVIDIA() && IsD3D11());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsWindows() && (IsVulkan() || IsOpenGL()));
 
     // These values are special, to trigger the rounding bug.
     unsigned int numItems       = 0x7FFFFFE;
@@ -666,6 +661,6 @@
     EXPECT_GL_ERROR(GL_INVALID_VALUE);
 }
 
-ANGLE_INSTANTIATE_TEST(BufferDataOverflowTest, ES3_D3D11());
+ANGLE_INSTANTIATE_TEST_ES3(BufferDataOverflowTest);
 
 #endif  // _WIN64
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BuiltinVariableTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BuiltinVariableTest.cpp
index 36932fd..da4764d 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BuiltinVariableTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BuiltinVariableTest.cpp
@@ -195,11 +195,7 @@
     runTest(GL_TRIANGLES, indices, 6);
 }
 
-ANGLE_INSTANTIATE_TEST(BuiltinVariableVertexIdTest,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(BuiltinVariableVertexIdTest);
 
 class BuiltinVariableFragDepthClampingFloatRBOTest : public ANGLETest
 {
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ClearTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ClearTest.cpp
index fd37167..17f5874 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ClearTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ClearTest.cpp
@@ -622,6 +622,8 @@
 // clears to the correct values.
 TEST_P(ClearTestES3, ClearMultipleAttachmentsFollowedBySpecificOne)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr uint32_t kSize            = 16;
     constexpr uint32_t kAttachmentCount = 5;
     std::vector<unsigned char> pixelData(kSize * kSize * 4, 255);
@@ -1461,17 +1463,8 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(ClearTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(ClearTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ClearTest);
+ANGLE_INSTANTIATE_TEST_ES3(ClearTestES3);
 ANGLE_INSTANTIATE_TEST_COMBINE_4(MaskedScissoredClearTest,
                                  MaskedScissoredClearVariationsTestPrint,
                                  testing::Range(0, 3),
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ClientArraysTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ClientArraysTest.cpp
index 7820731..18b8a66 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ClientArraysTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ClientArraysTest.cpp
@@ -108,13 +108,5 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(ClientArraysTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ClientArraysTest);
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ColorMaskTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ColorMaskTest.cpp
index 6075cf6..6f76089 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ColorMaskTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ColorMaskTest.cpp
@@ -73,13 +73,6 @@
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against. D3D11 Feature Level 9_3 uses different D3D formats for vertex
 // attribs compared to Feature Levels 10_0+, so we should test them separately.
-ANGLE_INSTANTIATE_TEST(ColorMaskTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ColorMaskTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ComputeShaderTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ComputeShaderTest.cpp
index 48f2d99..11f9881 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ComputeShaderTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ComputeShaderTest.cpp
@@ -872,6 +872,8 @@
 // Test that texelFetch works well in compute shader.
 TEST_P(ComputeShaderTest, TexelFetchFunction)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr char kCS[] = R"(#version 310 es
 layout(local_size_x=16, local_size_y=16) in;
 precision highp usampler2D;
@@ -940,6 +942,8 @@
 // Test that texture function works well in compute shader.
 TEST_P(ComputeShaderTest, TextureFunction)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr char kCS[] = R"(#version 310 es
 layout(local_size_x=16, local_size_y=16) in;
 precision highp usampler2D;
@@ -2694,6 +2698,11 @@
     // http://anglebug.com/3869
     ANGLE_SKIP_TEST_IF(IsVulkan());
 
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+    ANGLE_SKIP_TEST_IF(IsOpenGL() &&
+                       ((getClientMajorVersion() == 3) && (getClientMinorVersion() >= 1)));
+
     const char kCSShader[] = R"(#version 310 es
 layout (local_size_x = 4, local_size_y = 4, local_size_z = 1) in;
 layout (r32ui, binding = 0) readonly uniform highp uimage2D srcImage;
@@ -2736,8 +2745,6 @@
 {
     // glReadPixels is getting the result of the first dispatch call.  http://anglebug.com/3879
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && (IsAMD() || IsNVIDIA()));
-    // Flaky on Linux FYI Release (Intel HD 630).  http://anglebug.com/3934
-    ANGLE_SKIP_TEST_IF(IsVulkan() && IsLinux() && IsIntel());
 
     GLTexture texture[2];
     GLFramebuffer framebuffer;
@@ -2810,6 +2817,8 @@
 // Test storage buffer bound is unchanged, shader writes it, buffer content should be updated.
 TEST_P(ComputeShaderTest, StorageBufferBoundUnchanged)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr char kCS[] = R"(#version 310 es
 layout(local_size_x=16, local_size_y=16) in;
 precision highp usampler2D;
@@ -3012,9 +3021,6 @@
     // TODO(xinghua.cao@intel.com): http://anglebug.com/3101
     ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGL());
 
-    // Non-zero-level render target attachments are not yet supported.  http://anglebug.com/3184
-    ANGLE_SKIP_TEST_IF(IsVulkan());
-
     GLTexture texture[2];
     GLFramebuffer framebuffer;
     constexpr char kCS[] = R"(#version 310 es
@@ -3513,11 +3519,151 @@
     glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
 }
 
-ANGLE_INSTANTIATE_TEST(ComputeShaderTest,
-                       ES31_OPENGL(),
-                       ES31_OPENGLES(),
-                       ES31_D3D11(),
-                       ES31_VULKAN());
-ANGLE_INSTANTIATE_TEST(ComputeShaderTestES3, ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(WebGL2ComputeTest, ES31_D3D11(), ES31_VULKAN());
+// Test that render pipeline and compute pipeline access to the same texture.
+// Steps:
+//   1. Clear the texture and DrawArrays.
+//   2. DispatchCompute to set the image's first pixel to a specific color.
+//   3. DrawArrays and check data.
+TEST_P(ComputeShaderTest, DrawDispatchDrawPreserve)
+{
+    const char kCSSource[] = R"(#version 310 es
+layout(local_size_x=1, local_size_y=1) in;
+layout(rgba8, binding = 0) writeonly uniform highp image2D image;
+void main()
+{
+    imageStore(image, ivec2(0, 0), vec4(0.0, 0.0, 1.0, 1.0));
+})";
+
+    const char kVSSource[] = R"(#version 310 es
+layout (location = 0) in vec2 pos;
+in vec4 inTex;
+out vec4 texCoord;
+void main(void) {
+    texCoord = inTex;
+    gl_Position = vec4(pos, 0.0, 1.0);
+})";
+
+    const char kFSSource[] = R"(#version 310 es
+precision highp float;
+uniform sampler2D tex;
+in vec4 texCoord;
+out vec4 fragColor;
+void main(void) {
+    fragColor = texture(tex, texCoord.xy);
+})";
+    GLuint aPosLoc         = 0;
+    ANGLE_GL_PROGRAM(program, kVSSource, kFSSource);
+    glBindAttribLocation(program, aPosLoc, "pos");
+
+    unsigned char *data = new unsigned char[4 * getWindowWidth() * getWindowHeight()];
+    for (int i = 0; i < getWindowWidth() * getWindowHeight(); i++)
+    {
+        data[i * 4]     = 0xff;
+        data[i * 4 + 1] = 0;
+        data[i * 4 + 2] = 0;
+        data[i * 4 + 3] = 0xff;
+    }
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, getWindowWidth(), getWindowHeight());
+    // Clear the texture level 0 to Red.
+    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA,
+                    GL_UNSIGNED_BYTE, data);
+    for (int i = 0; i < getWindowWidth() * getWindowHeight(); i++)
+    {
+        data[i * 4]     = 0;
+        data[i * 4 + 1] = 0xff;
+        data[i * 4 + 2] = 0;
+        data[i * 4 + 3] = 0xff;
+    }
+    // Clear the texture level 1 to Green.
+    glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GL_RGBA,
+                    GL_UNSIGNED_BYTE, data);
+    delete[] data;
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    glUseProgram(program);
+    GLfloat vertices[]  = {-1, -1, 1, -1, -1, 1, 1, 1};
+    GLfloat texCoords[] = {0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f};
+    GLint pos           = glGetAttribLocation(program, "pos");
+    glEnableVertexAttribArray(pos);
+    glVertexAttribPointer(pos, 2, GL_FLOAT, GL_FALSE, 0, vertices);
+    GLint posTex = glGetAttribLocation(program, "inTex");
+    glEnableVertexAttribArray(posTex);
+    glVertexAttribPointer(posTex, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
+
+    // Draw with level 0, the whole frame buffer should be Red.
+    glViewport(0, 0, getWindowWidth(), getWindowHeight());
+    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+    EXPECT_GL_NO_ERROR();
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::red);
+    // Draw with level 1, the whole frame buffer should be Green.
+    glViewport(0, 0, getWindowWidth() / 2, getWindowHeight() / 2);
+    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+    EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::green);
+    EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2 - 1, getWindowHeight() / 2 - 1, GLColor::green);
+
+    // Clear the texture level 0's (0, 0) position to Blue.
+    glBindImageTexture(0, texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
+    ANGLE_GL_COMPUTE_PROGRAM(csProgram, kCSSource);
+    glUseProgram(csProgram);
+    glDispatchCompute(1, 1, 1);
+    glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
+    EXPECT_GL_NO_ERROR();
+    glFinish();
+
+    glUseProgram(program);
+    // Draw with level 0, the first position should be Blue.
+    glViewport(0, 0, getWindowWidth(), getWindowHeight());
+    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
+    EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::red);
+    // Draw with level 1, the whole frame buffer should be Green.
+    glViewport(0, 0, getWindowWidth() / 2, getWindowHeight() / 2);
+    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+    EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::green);
+    EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2 - 1, getWindowHeight() / 2 - 1, GLColor::green);
+}
+
+// Test that maxComputeWorkGroupCount is valid number.
+TEST_P(ComputeShaderTest, ValidateMaxComputeWorkGroupCount)
+{
+    constexpr char kCS[] = R"(#version 310 es
+layout(local_size_x=1) in;
+void main()
+{
+})";
+
+    GLuint program = glCreateProgram();
+    GLuint cs      = CompileShader(GL_COMPUTE_SHADER, kCS);
+    EXPECT_NE(0u, cs);
+
+    glAttachShader(program, cs);
+    glDeleteShader(cs);
+
+    GLint x, y, z;
+    glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &x);
+    EXPECT_LE(65535, x);
+    EXPECT_GE(std::numeric_limits<GLint>::max(), x);
+
+    glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &y);
+    EXPECT_LE(65535, y);
+    EXPECT_GE(std::numeric_limits<GLint>::max(), y);
+
+    glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &z);
+    EXPECT_LE(65535, z);
+    EXPECT_GE(std::numeric_limits<GLint>::max(), z);
+
+    glDeleteProgram(program);
+    EXPECT_GL_NO_ERROR();
+}
+
+ANGLE_INSTANTIATE_TEST_ES31(ComputeShaderTest);
+ANGLE_INSTANTIATE_TEST_ES3(ComputeShaderTestES3);
+ANGLE_INSTANTIATE_TEST_ES31(WebGL2ComputeTest);
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyCompressedTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyCompressedTextureTest.cpp
index 6206697..a3c4b21 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyCompressedTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyCompressedTextureTest.cpp
@@ -319,6 +319,8 @@
     {
         return;
     }
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
 
     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -343,14 +345,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(CopyCompressedTextureTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(CopyCompressedTextureTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexImageTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexImageTest.cpp
index fad1c33..d58748e 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexImageTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexImageTest.cpp
@@ -428,6 +428,9 @@
 // Calling CopyTexSubImage to a non-cube-complete texture.
 TEST_P(CopyTexImageTest, CopyTexSubImageToNonCubeCompleteDestination)
 {
+    // TODO(hqle): Find what wrong with NVIDIA GPU. http://anglebug.com/4137
+    ANGLE_SKIP_TEST_IF(IsNVIDIA() && IsMetal());
+
     constexpr GLsizei kCubeMapFaceCount = 6;
 
     // The framebuffer will be a 1x6 image with 6 different colors.  Each glCopyTexSubImage2D will
@@ -809,9 +812,5 @@
                        ES2_VULKAN(),
                        ES3_VULKAN());
 
-ANGLE_INSTANTIATE_TEST(CopyTexImageTestES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(CopyTexImageTestES3);
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexture3DTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexture3DTest.cpp
index f8ca1bf..e4a7084 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexture3DTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexture3DTest.cpp
@@ -1726,7 +1726,7 @@
              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, true, GLColor(255, 214, 81, 3));
 }
 
-ANGLE_INSTANTIATE_TEST(Texture3DCopy, ES3_D3D11());
-ANGLE_INSTANTIATE_TEST(Texture2DArrayCopy, ES3_D3D11());
+ANGLE_INSTANTIATE_TEST_ES3(Texture3DCopy);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DArrayCopy);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTextureTest.cpp
index c9a619f..7d4d86d 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTextureTest.cpp
@@ -867,6 +867,8 @@
 
 TEST_P(CopyTextureVariationsTest, CopyTexture)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     testCopyTexture(GL_TEXTURE_2D, std::get<1>(GetParam()), std::get<2>(GetParam()),
                     std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()));
 }
@@ -1562,6 +1564,8 @@
 // are set to 0.
 TEST_P(CopyTextureTestDest, AlphaCopyWithRGB)
 {
+    // http://anglebug.com/4121
+    ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGLES());
     ANGLE_SKIP_TEST_IF(!checkExtensions());
 
     GLColor originalPixels(50u, 100u, 150u, 155u);
@@ -1587,6 +1591,62 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
 }
 
+// Bug where TEXTURE_SWIZZLE_RGBA was not reset after the Luminance workaround. (crbug.com/1022080)
+TEST_P(CopyTextureTestES3, LuminanceWorkaroundTextureSwizzleBug)
+{
+
+    {
+        GLColor pixels(50u, 20u, 100u, 150u);
+
+        // Hit BlitGL::copySubImageToLUMAWorkaroundTexture by copying an ALPHA texture
+        GLTexture srcTexture;
+        glBindTexture(GL_TEXTURE_2D, srcTexture);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
+
+        GLFramebuffer srcFBO;
+        glBindFramebuffer(GL_FRAMEBUFFER, srcFBO);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexture, 0);
+
+        GLTexture dstTexture;
+        glBindTexture(GL_TEXTURE_2D, dstTexture);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
+
+        glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
+        EXPECT_GL_NO_ERROR();
+    }
+
+    {
+        // This time hit BlitGL::blitColorBufferWithShader by copying an SRGB texture
+        GLColor pixels(100u, 200u, 50u, 210u);
+
+        GLTexture srcTexture;
+        glBindTexture(GL_TEXTURE_2D, srcTexture);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT,
+                     GL_UNSIGNED_BYTE, &pixels);
+
+        GLFramebuffer srcFBO;
+        glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFBO);
+        glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexture,
+                               0);
+
+        GLTexture dstTexture;
+        glBindTexture(GL_TEXTURE_2D, dstTexture);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT,
+                     GL_UNSIGNED_BYTE, nullptr);
+
+        GLFramebuffer dstFBO;
+        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFBO);
+        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstTexture,
+                               0);
+
+        glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+
+        // The previous workaround should not affect this copy
+        glBindFramebuffer(GL_FRAMEBUFFER, dstFBO);
+        EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
+    }
+}
+
 // Test to ensure that CopyTexture will fail with a non-zero level and NPOT texture in WebGL
 TEST_P(CopyTextureTestWebGL, NPOT)
 {
@@ -1623,6 +1683,8 @@
     {
         return;
     }
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid() || IsVulkan());
 
     auto testOutput = [this](GLuint texture, const GLColor &expectedColor) {
         constexpr char kVS[] =
@@ -1760,6 +1822,8 @@
     }
 
     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
 
     auto testOutput = [this](GLuint texture, const GLColor32F &expectedColor) {
         constexpr char kVS[] =
@@ -1875,6 +1939,8 @@
 TEST_P(CopyTextureTestES3, ES3UintFormats)
 {
     ANGLE_SKIP_TEST_IF(IsLinux() && IsOpenGL() && IsIntel());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
 
     if (!checkExtensions())
     {
@@ -1991,12 +2057,7 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(CopyTextureTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(CopyTextureTest);
 ANGLE_INSTANTIATE_TEST_COMBINE_5(CopyTextureVariationsTest,
                                  CopyTextureVariationsTestPrint,
                                  testing::ValuesIn(kCopyTextureVariationsSrcFormats),
@@ -2009,13 +2070,12 @@
                                  ES2_OPENGL(),
                                  ES2_OPENGLES(),
                                  ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(CopyTextureTestWebGL,
-                       ES2_D3D9(),
+ANGLE_INSTANTIATE_TEST_ES2(CopyTextureTestWebGL);
+ANGLE_INSTANTIATE_TEST(CopyTextureTestDest,
                        ES2_D3D11(),
                        ES2_OPENGL(),
                        ES2_OPENGLES(),
                        ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(CopyTextureTestDest, ES2_D3D11());
-ANGLE_INSTANTIATE_TEST(CopyTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3(CopyTextureTestES3);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CubeMapTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CubeMapTextureTest.cpp
index a0f5a44..2030144 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CubeMapTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CubeMapTextureTest.cpp
@@ -62,6 +62,9 @@
     // http://anglebug.com/3145
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel() && IsFuchsia());
 
+    // TODO(hqle): Find what wrong with NVIDIA GPU. http://anglebug.com/4138
+    ANGLE_SKIP_TEST_IF(IsNVIDIA() && IsMetal());
+
     const GLfloat faceColors[] = {
         1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
         1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f,
@@ -230,6 +233,8 @@
 // within each face.  See section 3.7.5 of GLES2.0 (Cube Map Texture Selection).
 TEST_P(CubeMapTextureTest, SampleCoordinateTransform)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D9());
     // Create a program that samples from 6x4 directions of the cubemap, draw and verify that the
     // colors match the right color from |faceColors|.
     constexpr char kFS[] = R"(precision mediump float;
@@ -274,6 +279,8 @@
     ANGLE_SKIP_TEST_IF(IsAndroid() && IsVulkan());  // anglebug.com/3814
     ANGLE_SKIP_TEST_IF(IsD3D11());                  // anglebug.com/3856
     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_texture_lod"));
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D9());
 
     constexpr char kFS[] = R"(#extension GL_EXT_shader_texture_lod : require
 precision mediump float;
@@ -315,11 +322,4 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(CubeMapTextureTest,
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(CubeMapTextureTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp
index 7c4ec33..c96124f 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp
@@ -187,6 +187,6 @@
     SafeDelete(cleanSourceBuffer);
 }
 
-ANGLE_INSTANTIATE_TEST(D3D11EmulatedIndexedBufferTest, ES2_D3D11());
+ANGLE_INSTANTIATE_TEST(D3D11EmulatedIndexedBufferTest, ES2_D3D11(), ES3_D3D11(), ES31_D3D11());
 
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp
index bca7830..42a9bf9 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp
@@ -121,6 +121,6 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(D3D11InputLayoutCacheTest, ES2_D3D11());
+ANGLE_INSTANTIATE_TEST(D3D11InputLayoutCacheTest, ES2_D3D11(), ES3_D3D11(), ES31_D3D11());
 
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3DImageFormatConversionTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3DImageFormatConversionTest.cpp
index 5ca24c7..6404add 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3DImageFormatConversionTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3DImageFormatConversionTest.cpp
@@ -159,10 +159,6 @@
 // imageformats.h from the D3D renderer), we can still run the test against OpenGL. This is
 // valuable, since it provides extra validation using a renderer that doesn't use imageformats.h
 // itself.
-ANGLE_INSTANTIATE_TEST(D3DImageFormatConversionTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(D3DImageFormatConversionTest);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3DTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3DTextureTest.cpp
index 5f31fd1..8142182 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3DTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/D3DTextureTest.cpp
@@ -1438,8 +1438,8 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(D3DTextureTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(D3DTextureTestES3, ES3_D3D11(), ES3_OPENGL());
+ANGLE_INSTANTIATE_TEST_ES2(D3DTextureTest);
+ANGLE_INSTANTIATE_TEST_ES3(D3DTextureTestES3);
 // D3D Debug device reports an error. http://anglebug.com/3513
 // ANGLE_INSTANTIATE_TEST(D3DTextureTestMS, ES2_D3D11());
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXT1CompressedTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXT1CompressedTextureTest.cpp
index be85ef2..4278488 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXT1CompressedTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXT1CompressedTextureTest.cpp
@@ -412,15 +412,8 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(DXT1CompressedTextureTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DXT1CompressedTextureTest);
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(DXT1CompressedTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3(DXT1CompressedTextureTestES3);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXTSRGBCompressedTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXTSRGBCompressedTextureTest.cpp
index 86c2abb..4d3b9db 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXTSRGBCompressedTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXTSRGBCompressedTextureTest.cpp
@@ -147,11 +147,4 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(DXTSRGBCompressedTextureTest,
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DXTSRGBCompressedTextureTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DebugMarkerTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DebugMarkerTest.cpp
index 009d3c0..263c607 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DebugMarkerTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DebugMarkerTest.cpp
@@ -63,11 +63,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(DebugMarkerTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(DebugMarkerTest);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DebugTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DebugTest.cpp
index 39d295b..df17cf9 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DebugTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DebugTest.cpp
@@ -403,12 +403,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(DebugTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DebugTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilFormatsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilFormatsTest.cpp
index e8bb3e1..c5c1207 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilFormatsTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilFormatsTest.cpp
@@ -737,13 +737,8 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(DepthStencilFormatsTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(DepthStencilFormatsTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES2(DepthStencilFormatsTest);
+ANGLE_INSTANTIATE_TEST_ES3(DepthStencilFormatsTestES3);
 
 class TinyDepthStencilWorkaroundTest : public ANGLETest
 {
@@ -769,6 +764,9 @@
 // http://anglebug.com/1664
 TEST_P(TinyDepthStencilWorkaroundTest, DepthTexturesStick)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsOpenGLES()) || (IsLinux() && IsVulkan()));
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr char kDrawVS[] =
         "#version 100\n"
         "attribute vec3 vertex;\n"
@@ -873,4 +871,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(TinyDepthStencilWorkaroundTest, ES3_D3D11());
+ANGLE_INSTANTIATE_TEST_ES3(TinyDepthStencilWorkaroundTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilTest.cpp
index 96bcc58..49451d3 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilTest.cpp
@@ -244,19 +244,13 @@
 // Tests that clearing or rendering into a stencil-only format doesn't affect depth.
 TEST_P(DepthStencilTest, StencilOnlyEmulatedWithPacked)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D9());
     bindColorStencilFBO();
     prepareSingleEmulatedWithPacked();
     ensureDepthUnaffected();
 }
 
-ANGLE_INSTANTIATE_TEST(DepthStencilTest,
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DepthStencilTest);
 
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DifferentStencilMasksTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DifferentStencilMasksTest.cpp
index 57de47c..b07a5f5 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DifferentStencilMasksTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DifferentStencilMasksTest.cpp
@@ -67,6 +67,9 @@
 // Tests that effectively different front and back masks are illegal.
 TEST_P(DifferentStencilMasksTest, DrawWithDifferentMask)
 {
+    // TODO(hqle): Make this test work for Metal. http://anglebug.com/4134
+    ANGLE_SKIP_TEST_IF(IsMetal());
+
     glStencilMaskSeparate(GL_FRONT, 0x0001);
     glStencilMaskSeparate(GL_BACK, 0x0002);
 
@@ -100,11 +103,5 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(DifferentStencilMasksTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DifferentStencilMasksTest);
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DiscardFramebufferEXTTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DiscardFramebufferEXTTest.cpp
index 78b6eba..497fc8b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DiscardFramebufferEXTTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DiscardFramebufferEXTTest.cpp
@@ -26,7 +26,10 @@
 
 TEST_P(DiscardFramebufferEXTTest, DefaultFramebuffer)
 {
-    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("EXT_discard_framebuffer"));
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_discard_framebuffer"));
+
+    // TODO: fix crash issue. http://anglebug.com/4141
+    ANGLE_SKIP_TEST_IF(IsD3D11());
 
     // These should succeed on the default framebuffer
     const GLenum discards1[] = {GL_COLOR_EXT};
@@ -61,7 +64,7 @@
 
 TEST_P(DiscardFramebufferEXTTest, NonDefaultFramebuffer)
 {
-    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("EXT_discard_framebuffer"));
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_discard_framebuffer"));
 
     GLuint tex2D;
     GLuint framebuffer;
@@ -112,11 +115,4 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(DiscardFramebufferEXTTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DiscardFramebufferEXTTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawBaseVertexBaseInstanceTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawBaseVertexBaseInstanceTest.cpp
index f39de9f..abf6e3b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawBaseVertexBaseInstanceTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawBaseVertexBaseInstanceTest.cpp
@@ -318,9 +318,9 @@
         {
             baseInstances[i] = i * 2;
         }
-        glMultiDrawArraysInstancedBaseInstanceANGLE(GL_TRIANGLES, drawCount, counts.data(),
-                                                    instanceCounts.data(), firsts.data(),
-                                                    baseInstances.data());
+        glMultiDrawArraysInstancedBaseInstanceANGLE(GL_TRIANGLES, firsts.data(), counts.data(),
+                                                    instanceCounts.data(), baseInstances.data(),
+                                                    drawCount);
     }
 
     void doDrawElementsInstancedBaseVertexBaseInstance()
@@ -378,8 +378,8 @@
         }
 
         glMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(
-            GL_TRIANGLES, GL_UNSIGNED_SHORT, drawCount, counts.data(), instanceCounts.data(),
-            indices.data(), baseVertices.data(), baseInstances.data());
+            GL_TRIANGLES, counts.data(), GL_UNSIGNED_SHORT, indices.data(), instanceCounts.data(),
+            baseVertices.data(), baseInstances.data(), drawCount);
     }
 
     void checkDrawResult(bool hasBaseVertex, bool oneColumn = false)
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawBuffersTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawBuffersTest.cpp
index 5011602..ac9e419 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawBuffersTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawBuffersTest.cpp
@@ -641,16 +641,8 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(DrawBuffersTest,
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DrawBuffersTest);
 
-ANGLE_INSTANTIATE_TEST(DrawBuffersWebGL2Test, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(DrawBuffersWebGL2Test);
 
-ANGLE_INSTANTIATE_TEST(DrawBuffersTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(DrawBuffersTestES3);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawElementsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawElementsTest.cpp
index 9705813..f642c3f 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawElementsTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DrawElementsTest.cpp
@@ -111,6 +111,8 @@
 // deleting the applied index buffer.
 TEST_P(DrawElementsTest, DeletingAfterStreamingIndexes)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11());
     // Init program
     constexpr char kVS[] =
         "attribute vec2 position;\n"
@@ -311,6 +313,6 @@
     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
 }
 
-ANGLE_INSTANTIATE_TEST(DrawElementsTest, ES3_OPENGL(), ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(WebGLDrawElementsTest, ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(DrawElementsTest);
+ANGLE_INSTANTIATE_TEST_ES2(WebGLDrawElementsTest);
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ETCTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ETCTextureTest.cpp
index 0596ebb..39a3faf 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ETCTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ETCTextureTest.cpp
@@ -253,11 +253,5 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(ETCTextureTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ETCTextureTest);
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ExplicitContextTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ExplicitContextTest.cpp
index f1cb10d..5e02d6e 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ExplicitContextTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ExplicitContextTest.cpp
@@ -87,11 +87,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(ExplicitContextTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(ExplicitContextTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FenceSyncTests.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FenceSyncTests.cpp
index b201ddc..e45afb3 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FenceSyncTests.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FenceSyncTests.cpp
@@ -261,13 +261,5 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(FenceNVTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(FenceSyncTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(FenceNVTest);
+ANGLE_INSTANTIATE_TEST_ES3(FenceSyncTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferMixedSamplesTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferMixedSamplesTest.cpp
index 40727a7..b4609fd 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferMixedSamplesTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferMixedSamplesTest.cpp
@@ -266,8 +266,4 @@
     EXPECT_EQ(0, memcmp(results[0].get(), results[2].get(), kResultSize));
 }
 
-ANGLE_INSTANTIATE_TEST(CHROMIUMFramebufferMixedSamplesTest,
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGL(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(CHROMIUMFramebufferMixedSamplesTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferRenderMipmapTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferRenderMipmapTest.cpp
index b6aa154..6f442fc 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferRenderMipmapTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferRenderMipmapTest.cpp
@@ -53,6 +53,8 @@
 // when using a non-zero level in glFramebufferTexture2D.
 TEST_P(FramebufferRenderMipmapTest, Validation)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     bool renderToMipmapSupported =
         IsGLExtensionEnabled("GL_OES_fbo_render_mipmap") || getClientMajorVersion() > 2;
 
@@ -155,12 +157,4 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(FramebufferRenderMipmapTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(FramebufferRenderMipmapTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferTest.cpp
index ad483fd..9ba0571 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferTest.cpp
@@ -364,16 +364,7 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(FramebufferFormatsTest,
-                       ES2_VULKAN(),
-                       ES3_VULKAN(),
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(FramebufferFormatsTest);
 
 class FramebufferTest_ES3 : public ANGLETest
 {};
@@ -827,11 +818,7 @@
     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
 }
 
-ANGLE_INSTANTIATE_TEST(FramebufferTest_ES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(FramebufferTest_ES3);
 
 class FramebufferTest_ES31 : public ANGLETest
 {
@@ -1003,6 +990,8 @@
     ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
     // Occlusion query reports fragments outside the render area are still rendered
     ANGLE_SKIP_TEST_IF(IsAndroid() || (IsWindows() && (IsIntel() || IsAMD())));
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
 
     constexpr char kVS1[] = R"(#version 310 es
 in layout(location = 0) highp vec2 a_position;
@@ -1112,11 +1101,7 @@
     ASSERT_GL_NO_ERROR();
 }
 
-ANGLE_INSTANTIATE_TEST(FramebufferTest_ES31,
-                       ES31_D3D11(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES(),
-                       ES31_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES31(FramebufferTest_ES31);
 
 class AddDummyTextureNoRenderTargetTest : public ANGLETest
 {
@@ -1152,4 +1137,4 @@
     ASSERT_GL_NO_ERROR();
 }
 
-ANGLE_INSTANTIATE_TEST(AddDummyTextureNoRenderTargetTest, ES2_D3D11());
+ANGLE_INSTANTIATE_TEST_ES2(AddDummyTextureNoRenderTargetTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/GLSLTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/GLSLTest.cpp
index e9bef54..27be509 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/GLSLTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/GLSLTest.cpp
@@ -703,6 +703,8 @@
 // Draw an array of points with the first vertex offset at 0 using gl_VertexID
 TEST_P(GLSLTest_ES3, GLVertexIDOffsetZeroDrawArray)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr int kStartIndex  = 0;
     constexpr int kArrayLength = 5;
     constexpr char kVS[]       = R"(#version 300 es
@@ -765,6 +767,8 @@
 // https://github.com/KhronosGroup/WebGL/blob/master/sdk/tests/conformance2/rendering/vertex-id.html
 TEST_P(GLSLTest_ES3, GLVertexIDIntegerTextureDrawArrays)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // Have to set a large point size because the window size is much larger than the texture
     constexpr char kVS[] = R"(#version 300 es
 flat out highp int vVertexID;
@@ -820,6 +824,8 @@
 // Draw an array of points with the first vertex offset at 5 using gl_VertexID
 TEST_P(GLSLTest_ES3, GLVertexIDOffsetFiveDrawArray)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // Bug in Nexus drivers, offset does not work. (anglebug.com/3264)
     ANGLE_SKIP_TEST_IF((IsNexus5X() || IsNexus6P()) && IsOpenGLES());
 
@@ -6130,6 +6136,8 @@
 
     // AMD's OpenGL drivers may have the same issue. http://anglebug.com/1643
     ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsOpenGL());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
 
     constexpr char kPointCoordVS[] = R"(attribute vec2 position;
 uniform vec2 viewportSize;
@@ -6153,6 +6161,7 @@
                 static_cast<GLfloat>(getWindowHeight()));
 
     // Draw to backbuffer.
+    glClear(GL_COLOR_BUFFER_BIT);
     glDrawArrays(GL_POINTS, 0, 1);
     ASSERT_GL_NO_ERROR();
 
@@ -6172,6 +6181,7 @@
     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
 
     // Draw to user FBO.
+    glClear(GL_COLOR_BUFFER_BIT);
     glDrawArrays(GL_POINTS, 0, 1);
     ASSERT_GL_NO_ERROR();
 
@@ -7266,6 +7276,30 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
+// Test that dynamic indexing of swizzled l-values should work.
+// A simple porting of sdk/tests/conformance2/glsl3/vector-dynamic-indexing-swizzled-lvalue.html
+TEST_P(GLSLTest_ES3, DynamicIndexingOfSwizzledLValuesShouldWork)
+{
+    // The shader first assigns v.x to v.z (1.0)
+    // Then v.y to v.y (2.0)
+    // Then v.z to v.x (1.0)
+    constexpr char kFS[] = R"(#version 300 es
+precision highp float;
+out vec4 my_FragColor;
+void main() {
+    vec3 v = vec3(1.0, 2.0, 3.0);
+    for (int i = 0; i < 3; i++) {
+        v.zyx[i] = v[i];
+    }
+    my_FragColor = distance(v, vec3(1.0, 2.0, 1.0)) < 0.01 ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+})";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    EXPECT_GL_NO_ERROR();
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
 // Test that multiple nested assignments are handled correctly.
 TEST_P(GLSLTest_ES31, MixedRowAndColumnMajorMatrices_WriteSideEffect)
 {
@@ -7415,28 +7449,14 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(GLSLTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(GLSLTest);
 
-ANGLE_INSTANTIATE_TEST(GLSLTestNoValidation,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(GLSLTestNoValidation);
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(GLSLTest_ES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(GLSLTest_ES3);
 
-ANGLE_INSTANTIATE_TEST(WebGLGLSLTest, ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(WebGLGLSLTest);
 
-ANGLE_INSTANTIATE_TEST(GLSLTest_ES31, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES(), ES31_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES31(GLSLTest_ES31);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/GeometryShaderTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/GeometryShaderTest.cpp
index 6d31309..a753672 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/GeometryShaderTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/GeometryShaderTest.cpp
@@ -819,6 +819,6 @@
     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, status);
 }
 
-ANGLE_INSTANTIATE_TEST(GeometryShaderTestES3, ES3_OPENGL(), ES3_OPENGLES(), ES3_D3D11());
-ANGLE_INSTANTIATE_TEST(GeometryShaderTest, ES31_OPENGL(), ES31_OPENGLES(), ES31_D3D11());
+ANGLE_INSTANTIATE_TEST_ES3(GeometryShaderTestES3);
+ANGLE_INSTANTIATE_TEST_ES31(GeometryShaderTest);
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/GetImageTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/GetImageTest.cpp
new file mode 100644
index 0000000..e919482
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/GetImageTest.cpp
@@ -0,0 +1,297 @@
+//
+// 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.
+//
+// GetImageTest:
+//   Tests for the ANGLE_get_image extension.
+//
+
+#include "test_utils/ANGLETest.h"
+#include "test_utils/gl_raii.h"
+
+using namespace angle;
+
+namespace
+{
+constexpr uint32_t kSize        = 32;
+constexpr char kExtensionName[] = "GL_ANGLE_get_image";
+constexpr uint32_t kSmallSize   = 2;
+
+class GetImageTest : public ANGLETest
+{
+  public:
+    GetImageTest()
+    {
+        setWindowWidth(kSize);
+        setWindowHeight(kSize);
+        setConfigRedBits(8);
+        setConfigGreenBits(8);
+        setConfigBlueBits(8);
+        setConfigAlphaBits(8);
+    }
+};
+
+class GetImageTestNoExtensions : public ANGLETest
+{
+  public:
+    GetImageTestNoExtensions() { setExtensionsEnabled(false); }
+};
+
+GLTexture InitTextureWithSize(uint32_t size, void *pixelData)
+{
+    // Create a simple texture.
+    GLTexture tex;
+    glBindTexture(GL_TEXTURE_2D, tex);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    return tex;
+}
+
+GLTexture InitSimpleTexture()
+{
+    std::vector<GLColor> pixelData(kSize * kSize, GLColor::red);
+    return InitTextureWithSize(kSize, pixelData.data());
+}
+
+GLRenderbuffer InitRenderbufferWithSize(uint32_t size)
+{
+    // Create a simple renderbuffer.
+    GLRenderbuffer renderbuf;
+    glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
+    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, size, size);
+    return renderbuf;
+}
+
+GLRenderbuffer InitSimpleRenderbuffer()
+{
+    return InitRenderbufferWithSize(kSize);
+}
+
+// Test validation for the extension functions.
+TEST_P(GetImageTest, NegativeAPI)
+{
+    // Verify the extension is enabled.
+    ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
+
+    // Draw once with simple texture.
+    GLTexture tex = InitSimpleTexture();
+    ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
+    drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
+    ASSERT_GL_NO_ERROR();
+
+    // Pack pixels tightly.
+    glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+    // Verify GetTexImage can work with correct parameters.
+    std::vector<GLColor> buffer(kSize * kSize);
+    glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_NO_ERROR();
+
+    // Test invalid texture target.
+    glGetTexImageANGLE(GL_TEXTURE_CUBE_MAP, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+    // Test invalid texture level.
+    glGetTexImageANGLE(GL_TEXTURE_2D, -1, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_VALUE);
+    glGetTexImageANGLE(GL_TEXTURE_2D, 2000, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_VALUE);
+
+    // Test invalid format and type.
+    glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_NONE, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+    glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_NONE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+    // Create a simple renderbuffer.
+    GLRenderbuffer renderbuf = InitSimpleRenderbuffer();
+    ASSERT_GL_NO_ERROR();
+
+    // Verify GetRenderbufferImage can work with correct parameters.
+    glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_NO_ERROR();
+
+    // Test invalid renderbuffer target.
+    glGetRenderbufferImageANGLE(GL_TEXTURE_2D, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+    // Test invalid renderbuffer format/type.
+    glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_NONE, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+    glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_NONE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+    // Pack buffer tests. Requires ES 3+ or extension.
+    if (getClientMajorVersion() >= 3 || IsGLExtensionEnabled("GL_NV_pixel_buffer_object"))
+    {
+        // Test valid pack buffer.
+        GLBuffer packBuffer;
+        glBindBuffer(GL_PIXEL_PACK_BUFFER, packBuffer);
+        glBufferData(GL_PIXEL_PACK_BUFFER, kSize * kSize * sizeof(GLColor), nullptr,
+                     GL_STATIC_DRAW);
+        glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+        glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+        // Test too small pack buffer.
+        glBufferData(GL_PIXEL_PACK_BUFFER, kSize, nullptr, GL_STATIC_DRAW);
+        glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+        glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+    }
+}
+
+// Simple test for GetTexImage
+TEST_P(GetImageTest, GetTexImage)
+{
+    // Verify the extension is enabled.
+    ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
+
+    constexpr uint32_t kSmallSize     = 2;
+    std::vector<GLColor> expectedData = {GLColor::red, GLColor::blue, GLColor::green,
+                                         GLColor::yellow};
+
+    glViewport(0, 0, kSmallSize, kSmallSize);
+
+    // Draw once with simple texture.
+    GLTexture tex = InitTextureWithSize(kSmallSize, expectedData.data());
+    ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
+    drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
+    ASSERT_GL_NO_ERROR();
+
+    // Pack pixels tightly.
+    glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+    // Verify GetImage.
+    std::vector<GLColor> actualData(kSmallSize * kSmallSize);
+    glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
+    EXPECT_GL_NO_ERROR();
+    EXPECT_EQ(expectedData, actualData);
+}
+
+// Simple cube map test for GetTexImage
+TEST_P(GetImageTest, CubeMap)
+{
+    // Verify the extension is enabled.
+    ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
+
+    const std::array<std::array<GLColor, kSmallSize * kSmallSize>, kCubeFaces.size()> expectedData =
+        {{
+            {GLColor::red, GLColor::red, GLColor::red, GLColor::red},
+            {GLColor::green, GLColor::green, GLColor::green, GLColor::green},
+            {GLColor::blue, GLColor::blue, GLColor::blue, GLColor::blue},
+            {GLColor::yellow, GLColor::yellow, GLColor::yellow, GLColor::yellow},
+            {GLColor::cyan, GLColor::cyan, GLColor::cyan, GLColor::cyan},
+            {GLColor::magenta, GLColor::magenta, GLColor::magenta, GLColor::magenta},
+        }};
+
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
+
+    for (size_t faceIndex = 0; faceIndex < kCubeFaces.size(); ++faceIndex)
+    {
+        glTexImage2D(kCubeFaces[faceIndex], 0, GL_RGBA, kSmallSize, kSmallSize, 0, GL_RGBA,
+                     GL_UNSIGNED_BYTE, expectedData[faceIndex].data());
+    }
+    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    // Pack pixels tightly.
+    glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+    // Verify GetImage.
+    std::array<GLColor, kSmallSize *kSmallSize> actualData = {};
+    for (size_t faceIndex = 0; faceIndex < kCubeFaces.size(); ++faceIndex)
+    {
+        glGetTexImageANGLE(kCubeFaces[faceIndex], 0, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
+        EXPECT_GL_NO_ERROR();
+        EXPECT_EQ(expectedData[faceIndex], actualData);
+    }
+}
+
+// Simple test for GetRenderbufferImage
+TEST_P(GetImageTest, GetRenderbufferImage)
+{
+    // Verify the extension is enabled.
+    ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
+
+    std::vector<GLColor> expectedData = {GLColor::red, GLColor::blue, GLColor::green,
+                                         GLColor::yellow};
+
+    glViewport(0, 0, kSmallSize, kSmallSize);
+
+    // Set up a simple Framebuffer with a Renderbuffer.
+    GLRenderbuffer renderbuffer = InitRenderbufferWithSize(kSmallSize);
+    GLFramebuffer framebuffer;
+    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
+    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
+    ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+    // Draw once with simple texture.
+    GLTexture tex = InitTextureWithSize(kSmallSize, expectedData.data());
+    ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
+    drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
+    ASSERT_GL_NO_ERROR();
+
+    // Pack pixels tightly.
+    glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+    // Verify GetImage.
+    std::vector<GLColor> actualData(kSmallSize * kSmallSize);
+    glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
+    EXPECT_GL_NO_ERROR();
+    EXPECT_EQ(expectedData, actualData);
+}
+
+// Verifies that the extension enums and entry points are invalid when the extension is disabled.
+TEST_P(GetImageTestNoExtensions, EntryPointsInactive)
+{
+    // Verify the extension is not enabled.
+    ASSERT_FALSE(IsGLExtensionEnabled(kExtensionName));
+
+    // Draw once with simple texture.
+    GLTexture tex = InitSimpleTexture();
+    ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
+    drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
+    ASSERT_GL_NO_ERROR();
+
+    // Query implementation format and type. Should give invalid enum.
+    GLint param;
+    glGetTexParameteriv(GL_TEXTURE_2D, GL_IMPLEMENTATION_COLOR_READ_FORMAT, &param);
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+    glGetTexParameteriv(GL_TEXTURE_2D, GL_IMPLEMENTATION_COLOR_READ_TYPE, &param);
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+    // Verify calling GetTexImage produces an error.
+    std::vector<GLColor> buffer(kSize * kSize, 0);
+    glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+    // Create a simple renderbuffer.
+    GLRenderbuffer renderbuf = InitSimpleRenderbuffer();
+    ASSERT_GL_NO_ERROR();
+
+    // Query implementation format and type. Should give invalid enum.
+    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_IMPLEMENTATION_COLOR_READ_FORMAT, &param);
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_IMPLEMENTATION_COLOR_READ_TYPE, &param);
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+    // Verify calling GetRenderbufferImage produces an error.
+    glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+}
+
+ANGLE_INSTANTIATE_TEST(GetImageTest, ES2_VULKAN(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST(GetImageTestNoExtensions, ES2_VULKAN(), ES3_VULKAN());
+}  // namespace
\ No newline at end of file
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ImageTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ImageTest.cpp
index 5b7536d..a30c4db 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ImageTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ImageTest.cpp
@@ -510,8 +510,14 @@
         EXPECT_TRUE(has2DTextureExt());
         EXPECT_TRUE(hasCubemapExt());
         EXPECT_TRUE(hasRenderbufferExt());
-        // TODO(geofflang): Support GL_OES_EGL_image_external_essl3. http://anglebug.com/2668
-        EXPECT_FALSE(hasExternalESSL3Ext());
+        if (getClientMajorVersion() >= 3)
+        {
+            EXPECT_TRUE(hasExternalESSL3Ext());
+        }
+        else
+        {
+            EXPECT_FALSE(hasExternalESSL3Ext());
+        }
     }
     else
     {
@@ -1960,15 +1966,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(ImageTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(ImageTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ImageTest);
+ANGLE_INSTANTIATE_TEST_ES3(ImageTestES3);
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/IncompleteTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/IncompleteTextureTest.cpp
index 73ed876..07c7ee1 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/IncompleteTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/IncompleteTextureTest.cpp
@@ -171,6 +171,8 @@
 // Tests that incomplete textures don't get initialized with the unpack buffer contents.
 TEST_P(IncompleteTextureTestES3, UnpackBufferBound)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     std::vector<GLColor> red(16, GLColor::red);
 
     GLBuffer unpackBuffer;
@@ -186,6 +188,8 @@
 // Tests that the incomplete multisample texture has the correct alpha value.
 TEST_P(IncompleteTextureTestES31, MultisampleTexture)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     constexpr char kVS[] = R"(#version 310 es
 in vec2 position;
 out vec2 texCoord;
@@ -221,11 +225,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(IncompleteTextureTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(IncompleteTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(IncompleteTextureTestES31, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES2(IncompleteTextureTest);
+ANGLE_INSTANTIATE_TEST_ES3(IncompleteTextureTestES3);
+ANGLE_INSTANTIATE_TEST_ES31(IncompleteTextureTestES31);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/IndexedPointsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/IndexedPointsTest.cpp
index d0902ca..d47ca0b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/IndexedPointsTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/IndexedPointsTest.cpp
@@ -192,26 +192,36 @@
 
 TEST_P(IndexedPointsTestUByte, UnsignedByteOffset0)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(0);
 }
 
 TEST_P(IndexedPointsTestUByte, UnsignedByteOffset1)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(1);
 }
 
 TEST_P(IndexedPointsTestUByte, UnsignedByteOffset2)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(2);
 }
 
 TEST_P(IndexedPointsTestUByte, UnsignedByteOffset3)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(3);
 }
 
 TEST_P(IndexedPointsTestUByte, VertexWithColorUnsignedByteOffset0)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(fjhenigman): Fix with buffer offset http://anglebug.com/2848
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD());
 
@@ -220,6 +230,8 @@
 
 TEST_P(IndexedPointsTestUByte, VertexWithColorUnsignedByteOffset1)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(fjhenigman): Fix with buffer offset http://anglebug.com/2848
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD());
 
@@ -228,6 +240,8 @@
 
 TEST_P(IndexedPointsTestUByte, VertexWithColorUnsignedByteOffset2)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(fjhenigman): Fix with buffer offset http://anglebug.com/2848
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD());
 
@@ -236,6 +250,8 @@
 
 TEST_P(IndexedPointsTestUByte, VertexWithColorUnsignedByteOffset3)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(fjhenigman): Fix with buffer offset http://anglebug.com/2848
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD());
 
@@ -246,26 +262,36 @@
 
 TEST_P(IndexedPointsTestUShort, UnsignedShortOffset0)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(0);
 }
 
 TEST_P(IndexedPointsTestUShort, UnsignedShortOffset1)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(1);
 }
 
 TEST_P(IndexedPointsTestUShort, UnsignedShortOffset2)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(2);
 }
 
 TEST_P(IndexedPointsTestUShort, UnsignedShortOffset3)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(3);
 }
 
 TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffset0)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(fjhenigman): Fix with buffer offset http://anglebug.com/2848
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD());
 
@@ -274,6 +300,8 @@
 
 TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffset1)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(fjhenigman): Fix with buffer offset http://anglebug.com/2848
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD());
 
@@ -282,6 +310,8 @@
 
 TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffset2)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(fjhenigman): Fix with buffer offset http://anglebug.com/2848
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD());
 
@@ -290,6 +320,8 @@
 
 TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffset3)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(fjhenigman): Fix with buffer offset http://anglebug.com/2848
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD());
 
@@ -298,6 +330,8 @@
 
 TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffsetChangingIndices)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     // TODO(fjhenigman): Fix with buffer offset http://anglebug.com/2848
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD());
 
@@ -318,7 +352,8 @@
     {
         return;
     }
-
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(0);
 }
 
@@ -328,7 +363,8 @@
     {
         return;
     }
-
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(1);
 }
 
@@ -338,7 +374,8 @@
     {
         return;
     }
-
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(2);
 }
 
@@ -348,7 +385,8 @@
     {
         return;
     }
-
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(3);
 }
 
@@ -358,7 +396,8 @@
     {
         return;
     }
-
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(0, false);
 }
 
@@ -368,7 +407,8 @@
     {
         return;
     }
-
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(1, false);
 }
 
@@ -378,7 +418,8 @@
     {
         return;
     }
-
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(2, false);
 }
 
@@ -388,7 +429,8 @@
     {
         return;
     }
-
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     runTest(3, false);
 }
 
@@ -396,18 +438,6 @@
 // http://anglebug.com/2646
 
 // TODO(geofflang): Figure out why this test fails on Intel OpenGL
-ANGLE_INSTANTIATE_TEST(IndexedPointsTestUByte,
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(IndexedPointsTestUShort,
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(IndexedPointsTestUInt,
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
\ No newline at end of file
+ANGLE_INSTANTIATE_TEST_ES2(IndexedPointsTestUByte);
+ANGLE_INSTANTIATE_TEST_ES2(IndexedPointsTestUShort);
+ANGLE_INSTANTIATE_TEST_ES2(IndexedPointsTestUInt);
\ No newline at end of file
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/InstancingTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/InstancingTest.cpp
index 8b2d439..872a6b9 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/InstancingTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/InstancingTest.cpp
@@ -480,6 +480,8 @@
 // Verify that a large divisor that also changes doesn't cause issues and renders correctly.
 TEST_P(InstancingTestES3, LargeDivisor)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr char kVS[] = R"(#version 300 es
 layout(location = 0) in vec4 a_position;
 layout(location = 1) in vec4 a_color;
@@ -579,6 +581,8 @@
 // incorrectly clamped down to the maximum signed integer.
 TEST_P(InstancingTestES3, LargestDivisor)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr GLuint kLargeDivisor = std::numeric_limits<GLuint>::max();
     glVertexAttribDivisor(0, kLargeDivisor);
 
@@ -588,13 +592,8 @@
         << "Vertex attrib divisor read was not the same that was passed in.";
 }
 
-ANGLE_INSTANTIATE_TEST(InstancingTestES3, ES3_OPENGL(), ES3_OPENGLES(), ES3_D3D11(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(InstancingTestES3);
 
-ANGLE_INSTANTIATE_TEST(InstancingTestES31, ES31_OPENGL(), ES31_OPENGLES(), ES31_D3D11());
+ANGLE_INSTANTIATE_TEST_ES31(InstancingTestES31);
 
-ANGLE_INSTANTIATE_TEST(InstancingTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(InstancingTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/LineLoopTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/LineLoopTest.cpp
index 93ca867..e7139ce 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/LineLoopTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/LineLoopTest.cpp
@@ -310,11 +310,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(LineLoopTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(LineLoopTest);
 
-ANGLE_INSTANTIATE_TEST(LineLoopIndirectTest, ES31_OPENGLES(), ES31_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES31(LineLoopIndirectTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/LinkAndRelinkTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/LinkAndRelinkTest.cpp
index a44b55b..d459ea2 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/LinkAndRelinkTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/LinkAndRelinkTest.cpp
@@ -444,15 +444,7 @@
     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
 }
 
-ANGLE_INSTANTIATE_TEST(LinkAndRelinkTest,
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_D3D11(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(LinkAndRelinkTestES31, ES31_OPENGL(), ES31_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(LinkAndRelinkTest);
+ANGLE_INSTANTIATE_TEST_ES31(LinkAndRelinkTestES31);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MemoryObjectTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MemoryObjectTest.cpp
index c137c17..2eec218 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MemoryObjectTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MemoryObjectTest.cpp
@@ -66,14 +66,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(MemoryObjectTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(MemoryObjectTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MemorySizeTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MemorySizeTest.cpp
index 0168965..aec41a8 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MemorySizeTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MemorySizeTest.cpp
@@ -131,13 +131,5 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(MemorySizeTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(MemorySizeTest);
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MipmapTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MipmapTest.cpp
index 79638cb..327443f 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MipmapTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MipmapTest.cpp
@@ -1246,14 +1246,5 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(MipmapTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_D3D11_PRESENT_PATH_FAST(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(MipmapTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(MipmapTest);
+ANGLE_INSTANTIATE_TEST_ES3(MipmapTestES3);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampleCompatibilityTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampleCompatibilityTest.cpp
index d702984..ac088ff 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampleCompatibilityTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampleCompatibilityTest.cpp
@@ -274,11 +274,7 @@
     EXPECT_EQ(0, memcmp(results[0].get(), results[2].get(), kResultSize));
 }
 
-ANGLE_INSTANTIATE_TEST(EXTMultisampleCompatibilityTest,
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGL(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(EXTMultisampleCompatibilityTest);
 
 class MultisampleCompatibilityTest : public ANGLETest
 {
@@ -401,12 +397,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(MultisampleCompatibilityTest,
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(MultisampleCompatibilityTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp
new file mode 100644
index 0000000..cb90c5b
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp
@@ -0,0 +1,738 @@
+//
+// 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.
+//
+
+// MultisampledRenderToTextureTest: Tests of EXT_multisampled_render_to_texture extension
+
+#include "test_utils/ANGLETest.h"
+#include "test_utils/gl_raii.h"
+
+using namespace angle;
+
+namespace
+{
+constexpr char kBasicVertexShader[] =
+    R"(attribute vec3 position;
+void main()
+{
+    gl_Position = vec4(position, 1);
+})";
+
+constexpr char kGreenFragmentShader[] =
+    R"(void main()
+{
+    gl_FragColor = vec4(0, 1, 0, 1);
+})";
+
+constexpr char kRedFragmentShader[] =
+    R"(void main()
+{
+    gl_FragColor = vec4(1, 0, 0, 1);
+})";
+
+constexpr char kVS[] =
+    "precision highp float;\n"
+    "attribute vec4 position;\n"
+    "varying vec2 texcoord;\n"
+    "\n"
+    "void main()\n"
+    "{\n"
+    "    gl_Position = position;\n"
+    "    texcoord = (position.xy * 0.5) + 0.5;\n"
+    "}\n";
+
+constexpr char kFS[] =
+    "precision highp float;\n"
+    "uniform sampler2D tex;\n"
+    "varying vec2 texcoord;\n"
+    "\n"
+    "void main()\n"
+    "{\n"
+    "    gl_FragColor = texture2D(tex, texcoord);\n"
+    "}\n";
+
+class MultisampledRenderToTextureTest : public ANGLETest
+{
+  protected:
+    MultisampledRenderToTextureTest()
+    {
+        setWindowWidth(64);
+        setWindowHeight(64);
+        setConfigRedBits(8);
+        setConfigGreenBits(8);
+        setConfigBlueBits(8);
+        setConfigAlphaBits(8);
+    }
+
+    void testSetUp() override {}
+
+    void testTearDown() override {}
+
+    void setupCopyTexProgram()
+    {
+        mCopyTextureProgram.makeRaster(kVS, kFS);
+        ASSERT_GL_TRUE(mCopyTextureProgram.valid());
+
+        mCopyTextureUniformLocation = glGetUniformLocation(mCopyTextureProgram, "tex");
+
+        ASSERT_GL_NO_ERROR();
+    }
+
+    void verifyResults(GLuint texture,
+                       GLubyte data[4],
+                       GLint fboSize,
+                       GLint xs,
+                       GLint ys,
+                       GLint xe,
+                       GLint ye)
+    {
+        glViewport(0, 0, fboSize, fboSize);
+
+        glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
+        // Draw a quad with the target texture
+        glUseProgram(mCopyTextureProgram);
+        glBindTexture(GL_TEXTURE_2D, texture);
+        glUniform1i(mCopyTextureUniformLocation, 0);
+
+        drawQuad(mCopyTextureProgram, "position", 0.5f);
+
+        // Expect that the rendered quad has the same color as the source texture
+        EXPECT_PIXEL_NEAR(xs, ys, data[0], data[1], data[2], data[3], 1.0);
+        EXPECT_PIXEL_NEAR(xs, ye - 1, data[0], data[1], data[2], data[3], 1.0);
+        EXPECT_PIXEL_NEAR(xe - 1, ys, data[0], data[1], data[2], data[3], 1.0);
+        EXPECT_PIXEL_NEAR(xe - 1, ye - 1, data[0], data[1], data[2], data[3], 1.0);
+        EXPECT_PIXEL_NEAR((xs + xe) / 2, (ys + ye) / 2, data[0], data[1], data[2], data[3], 1.0);
+    }
+
+    void clearAndDrawQuad(GLuint program, GLsizei viewportWidth, GLsizei viewportHeight)
+    {
+        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+        glClear(GL_COLOR_BUFFER_BIT);
+        glViewport(0, 0, viewportWidth, viewportHeight);
+        ASSERT_GL_NO_ERROR();
+
+        drawQuad(program, "position", 0.0f);
+    }
+
+    GLProgram mCopyTextureProgram;
+    GLint mCopyTextureUniformLocation = -1;
+};
+
+class MultisampledRenderToTextureES3Test : public MultisampledRenderToTextureTest
+{};
+
+// Checking against invalid parameters for RenderbufferStorageMultisampleEXT.
+TEST_P(MultisampledRenderToTextureTest, RenderbufferParameterCheck)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+
+    GLRenderbuffer renderbuffer;
+    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
+
+    // Positive test case
+    glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, 64, 64);
+    ASSERT_GL_NO_ERROR();
+
+    GLint samples;
+    glGetIntegerv(GL_MAX_SAMPLES_EXT, &samples);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_GE(samples, 1);
+
+    // Samples too large
+    glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples + 1, GL_DEPTH_COMPONENT16, 64, 64);
+    ASSERT_GL_ERROR(GL_INVALID_VALUE);
+
+    // Renderbuffer size too large
+    GLint maxSize;
+    glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &maxSize);
+    glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT16, maxSize + 1,
+                                        maxSize);
+    ASSERT_GL_ERROR(GL_INVALID_VALUE);
+    glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT16, maxSize,
+                                        maxSize + 1);
+    ASSERT_GL_ERROR(GL_INVALID_VALUE);
+
+    // Retrieving samples
+    glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, 64, 64);
+    GLint param = 0;
+    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES_EXT, &param);
+    // GE because samples may vary base on implementation. Spec says "the resulting value for
+    // RENDERBUFFER_SAMPLES_EXT is guaranteed to be greater than or equal to samples and no more
+    // than the next larger sample count supported by the implementation"
+    EXPECT_GE(param, 4);
+}
+
+// Checking against invalid parameters for FramebufferTexture2DMultisampleEXT.
+TEST_P(MultisampledRenderToTextureTest, Texture2DParameterCheck)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+    ASSERT_GL_NO_ERROR();
+
+    GLFramebuffer fbo;
+    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+    // Positive test case
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+    ASSERT_GL_NO_ERROR();
+
+    // Attachment not COLOR_ATTACHMENT0
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+    ASSERT_GL_ERROR(GL_INVALID_ENUM);
+
+    // Target not framebuffer
+    glFramebufferTexture2DMultisampleEXT(GL_RENDERBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+    ASSERT_GL_ERROR(GL_INVALID_ENUM);
+
+    GLint samples;
+    glGetIntegerv(GL_MAX_SAMPLES_EXT, &samples);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_GE(samples, 1);
+
+    // Samples too large
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, samples + 1);
+    ASSERT_GL_ERROR(GL_INVALID_VALUE);
+
+    // Retrieving samples
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+    GLint param = 0;
+    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                          GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT, &param);
+    // GE because samples may vary base on implementation. Spec says "the resulting value for
+    // TEXTURE_SAMPLES_EXT is guaranteed to be greater than or equal to samples and no more than the
+    // next larger sample count supported by the implementation"
+    EXPECT_GE(param, 4);
+}
+
+// Checking against invalid parameters for FramebufferTexture2DMultisampleEXT (cubemap).
+TEST_P(MultisampledRenderToTextureTest, TextureCubeMapParameterCheck)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
+    for (GLenum face = 0; face < 6; face++)
+    {
+        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA, 64, 64, 0, GL_RGBA,
+                     GL_UNSIGNED_BYTE, nullptr);
+        ASSERT_GL_NO_ERROR();
+    }
+
+    GLint samples;
+    glGetIntegerv(GL_MAX_SAMPLES_EXT, &samples);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_GE(samples, 1);
+
+    GLFramebuffer FBO;
+    glBindFramebuffer(GL_FRAMEBUFFER, FBO);
+    for (GLenum face = 0; face < 6; face++)
+    {
+        // Positive test case
+        glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                             GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0, 4);
+        ASSERT_GL_NO_ERROR();
+
+        // Attachment not COLOR_ATTACHMENT0
+        glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,
+                                             GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0, 4);
+        ASSERT_GL_ERROR(GL_INVALID_ENUM);
+
+        // Target not framebuffer
+        glFramebufferTexture2DMultisampleEXT(GL_RENDERBUFFER, GL_COLOR_ATTACHMENT0,
+                                             GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0, 4);
+        ASSERT_GL_ERROR(GL_INVALID_ENUM);
+
+        // Samples too large
+        glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                             GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0,
+                                             samples + 1);
+        ASSERT_GL_ERROR(GL_INVALID_VALUE);
+
+        // Retrieving samples
+        glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                             GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0, 4);
+        GLint param = 0;
+        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                              GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT,
+                                              &param);
+        // GE because samples may vary base on implementation. Spec says "the resulting value for
+        // TEXTURE_SAMPLES_EXT is guaranteed to be greater than or equal to samples and no more than
+        // the next larger sample count supported by the implementation"
+        EXPECT_GE(param, 4);
+    }
+}
+
+// Checking for framebuffer completeness using extension methods.
+TEST_P(MultisampledRenderToTextureTest, FramebufferCompleteness)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+
+    // Checking that Renderbuffer and texture2d having different number of samples results
+    // in a FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+    ASSERT_GL_NO_ERROR();
+
+    GLFramebuffer FBO;
+    glBindFramebuffer(GL_FRAMEBUFFER, FBO);
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+    EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+    GLRenderbuffer renderbuffer;
+    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
+    glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 8, GL_DEPTH_COMPONENT16, 64, 64);
+    ASSERT_GL_NO_ERROR();
+    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);
+    EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE,
+                     glCheckFramebufferStatus(GL_FRAMEBUFFER));
+}
+
+// Draw test with color attachment only.
+TEST_P(MultisampledRenderToTextureTest, 2DColorAttachmentMultisampleDrawTest)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+    // Set up texture and bind to FBO
+    GLsizei size = 6;
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+    ASSERT_GL_NO_ERROR();
+
+    GLFramebuffer FBO;
+    glBindFramebuffer(GL_FRAMEBUFFER, FBO);
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+    EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+    // Set viewport and clear to black
+    glViewport(0, 0, size, size);
+    glClearColor(0.0, 0.0, 0.0, 1.0);
+    glClear(GL_COLOR_BUFFER_BIT);
+
+    // Set up Green square program
+    ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
+    glUseProgram(program);
+    GLint positionLocation = glGetAttribLocation(program, "position");
+    ASSERT_NE(-1, positionLocation);
+
+    setupQuadVertexBuffer(0.5f, 0.5f);
+    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
+    glEnableVertexAttribArray(positionLocation);
+
+    // Draw green square
+    glDrawArrays(GL_TRIANGLES, 0, 6);
+    ASSERT_GL_NO_ERROR();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(size / 2, size / 2, GLColor::green);
+
+    // Set up Red square program
+    ANGLE_GL_PROGRAM(program2, kBasicVertexShader, kRedFragmentShader);
+    glUseProgram(program2);
+    GLint positionLocation2 = glGetAttribLocation(program2, "position");
+    ASSERT_NE(-1, positionLocation2);
+
+    setupQuadVertexBuffer(0.5f, 0.75f);
+    glVertexAttribPointer(positionLocation2, 3, GL_FLOAT, GL_FALSE, 0, 0);
+
+    // Draw red square
+    glDrawArrays(GL_TRIANGLES, 0, 6);
+    ASSERT_GL_NO_ERROR();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(size / 2, size / 2, GLColor::red);
+
+    glDisableVertexAttribArray(0);
+    glBindBuffer(GL_ARRAY_BUFFER, 0);
+}
+
+// Draw test using both color and depth attachments.
+TEST_P(MultisampledRenderToTextureTest, 2DColorDepthMultisampleDrawTest)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+    GLsizei size = 6;
+    // create complete framebuffer with depth buffer
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+    ASSERT_GL_NO_ERROR();
+
+    GLFramebuffer FBO;
+    glBindFramebuffer(GL_FRAMEBUFFER, FBO);
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+
+    GLRenderbuffer renderbuffer;
+    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
+    glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, size, size);
+    ASSERT_GL_NO_ERROR();
+    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);
+    EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+    // Set viewport and clear framebuffer
+    glViewport(0, 0, size, size);
+    glClearColor(0.0, 0.0, 0.0, 1.0);
+    glClearDepthf(0.5f);
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+    // Draw first green square
+    ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
+    glEnable(GL_DEPTH_TEST);
+    glDepthFunc(GL_GREATER);
+    glUseProgram(program);
+    GLint positionLocation = glGetAttribLocation(program, "position");
+    ASSERT_NE(-1, positionLocation);
+
+    setupQuadVertexBuffer(0.8f, 0.5f);
+    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
+    glEnableVertexAttribArray(positionLocation);
+
+    // Tests that TRIANGLES works.
+    glDrawArrays(GL_TRIANGLES, 0, 6);
+    ASSERT_GL_NO_ERROR();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(size / 2, size / 2, GLColor::green);
+
+    // Draw red square behind green square
+    ANGLE_GL_PROGRAM(program2, kBasicVertexShader, kRedFragmentShader);
+    glUseProgram(program2);
+    GLint positionLocation2 = glGetAttribLocation(program2, "position");
+    ASSERT_NE(-1, positionLocation2);
+
+    setupQuadVertexBuffer(0.7f, 1.0f);
+    glVertexAttribPointer(positionLocation2, 3, GL_FLOAT, GL_FALSE, 0, 0);
+
+    glDrawArrays(GL_TRIANGLES, 0, 6);
+    ASSERT_GL_NO_ERROR();
+    glDisable(GL_DEPTH_TEST);
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(size / 2, size / 2, GLColor::green);
+
+    glDisableVertexAttribArray(0);
+    glBindBuffer(GL_ARRAY_BUFFER, 0);
+}
+
+// Read pixels with pack buffer. ES3+.
+TEST_P(MultisampledRenderToTextureES3Test, MultisampleReadPixelsTest)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+
+    // PBO only available ES3 and above
+    ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
+    GLsizei size = 6;
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, size, size);
+    ASSERT_GL_NO_ERROR();
+
+    GLFramebuffer FBO;
+    glBindFramebuffer(GL_FRAMEBUFFER, FBO);
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+    EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+    // Set viewport and clear to red
+    glViewport(0, 0, size, size);
+    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+    glClear(GL_COLOR_BUFFER_BIT);
+    ASSERT_GL_NO_ERROR();
+
+    // Bind Pack Pixel Buffer and read to it
+    GLBuffer PBO;
+    glBindBuffer(GL_PIXEL_PACK_BUFFER, PBO);
+    glBufferData(GL_PIXEL_PACK_BUFFER, 4 * size * size, nullptr, GL_STATIC_DRAW);
+    glReadPixels(0, 0, size, size, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+    ASSERT_GL_NO_ERROR();
+
+    // Retrieving pixel color
+    void *mappedPtr    = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
+    GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_EQ(GLColor::red, dataColor[0]);
+
+    glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
+    EXPECT_GL_NO_ERROR();
+}
+
+// CopyTexImage from a multisampled texture functionality test.
+TEST_P(MultisampledRenderToTextureTest, MultisampleCopyTexImageTest)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+    GLsizei size = 16;
+
+    setupCopyTexProgram();
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+
+    // Disable mipmapping
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    GLFramebuffer FBO;
+    glBindFramebuffer(GL_FRAMEBUFFER, FBO);
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+
+    // Set color for framebuffer
+    glClearColor(0.25f, 1.0f, 0.75f, 0.5f);
+    glClear(GL_COLOR_BUFFER_BIT);
+    ASSERT_GL_NO_ERROR();
+
+    GLTexture copyToTex;
+    glBindTexture(GL_TEXTURE_2D, copyToTex);
+
+    // Disable mipmapping
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, size, size, 0);
+    ASSERT_GL_NO_ERROR();
+
+    GLubyte expected[4] = {64, 255, 191, 255};
+    verifyResults(copyToTex, expected, size, 0, 0, size, size);
+}
+
+// CopyTexSubImage from a multisampled texture functionality test.
+TEST_P(MultisampledRenderToTextureTest, MultisampleCopyTexSubImageTest)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+    GLsizei size = 16;
+
+    setupCopyTexProgram();
+
+    GLTexture texture;
+    // Create texture in copyFBO0 with color (.25, 1, .75, .5)
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+
+    // Disable mipmapping
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    GLFramebuffer copyFBO0;
+    glBindFramebuffer(GL_FRAMEBUFFER, copyFBO0);
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+
+    // Set color for
+    glClearColor(0.25f, 1.0f, 0.75f, 0.5f);
+    glClear(GL_COLOR_BUFFER_BIT);
+    ASSERT_GL_NO_ERROR();
+
+    // Create texture in copyFBO[1] with color (1, .75, .5, .25)
+    GLTexture texture1;
+    glBindTexture(GL_TEXTURE_2D, texture1);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+
+    // Disable mipmapping
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    GLFramebuffer copyFBO1;
+    glBindFramebuffer(GL_FRAMEBUFFER, copyFBO1);
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture1, 0, 4);
+
+    // Set color for
+    glClearColor(1.0f, 0.75f, 0.5f, 0.25f);
+    glClear(GL_COLOR_BUFFER_BIT);
+    ASSERT_GL_NO_ERROR();
+
+    GLTexture copyToTex;
+    glBindTexture(GL_TEXTURE_2D, copyToTex);
+
+    // Disable mipmapping
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    // copyFBO0 -> copyToTex
+    // copyToTex should hold what was originally in copyFBO0 : (.25, 1, .75, .5)
+    glBindFramebuffer(GL_FRAMEBUFFER, copyFBO0);
+    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, size, size, 0);
+    ASSERT_GL_NO_ERROR();
+
+    GLubyte expected0[4] = {64, 255, 191, 255};
+    verifyResults(copyToTex, expected0, size, 0, 0, size, size);
+
+    // copyFBO[1] - copySubImage -> copyToTex
+    // copyToTex should have subportion what was in copyFBO[1] : (1, .75, .5, .25)
+    // The rest should still be untouched: (.25, 1, .75, .5)
+    GLint half = size / 2;
+    glBindFramebuffer(GL_FRAMEBUFFER, copyFBO1);
+    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, half, half, half, half, half, half);
+    ASSERT_GL_NO_ERROR();
+
+    GLubyte expected1[4] = {255, 191, 127, 255};
+    verifyResults(copyToTex, expected1, size, half, half, size, size);
+
+    // Verify rest is untouched
+    verifyResults(copyToTex, expected0, size, 0, 0, half, half);
+    verifyResults(copyToTex, expected0, size, 0, half, half, size);
+    verifyResults(copyToTex, expected0, size, half, 0, size, half);
+}
+
+// BlitFramebuffer functionality test. ES3+.
+TEST_P(MultisampledRenderToTextureES3Test, MultisampleBlitFramebufferTest)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+    // blitFramebuffer only available ES3 and above
+    ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
+
+    GLsizei size = 16;
+
+    // Create multisampled framebuffer to use as source.
+    GLRenderbuffer depthMS;
+    glBindRenderbuffer(GL_RENDERBUFFER, depthMS.get());
+    glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT24, size, size);
+
+    GLTexture colorMS;
+    glBindTexture(GL_TEXTURE_2D, colorMS);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+
+    GLFramebuffer fboMS;
+    glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
+    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthMS.get());
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         colorMS, 0, 4);
+    ASSERT_GL_NO_ERROR();
+
+    // Clear depth to 0.5 and color to green.
+    glClearDepthf(0.5f);
+    glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
+    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+    glFlush();
+    ASSERT_GL_NO_ERROR();
+
+    // Draw red into the multisampled color buffer.
+    ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
+    glEnable(GL_DEPTH_TEST);
+    glDepthFunc(GL_EQUAL);
+    drawQuad(drawRed.get(), essl1_shaders::PositionAttrib(), 0.0f);
+    ASSERT_GL_NO_ERROR();
+
+    // Create single sampled framebuffer to use as dest.
+    GLFramebuffer fboSS;
+    glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
+    GLTexture colorSS;
+    glBindTexture(GL_TEXTURE_2D, colorSS);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorSS, 0);
+    ASSERT_GL_NO_ERROR();
+
+    // Bind MS to READ as SS is already bound to DRAW.
+    glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMS.get());
+    glBlitFramebuffer(0, 0, size, size, 0, 0, size, size, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+    ASSERT_GL_NO_ERROR();
+
+    // Bind SS to READ so we can readPixels from it
+    glBindFramebuffer(GL_FRAMEBUFFER, fboSS.get());
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(size - 1, 0, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(0, size - 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(size - 1, size - 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(size / 2, size / 2, GLColor::red);
+    ASSERT_GL_NO_ERROR();
+}
+
+// GenerateMipmap functionality test
+TEST_P(MultisampledRenderToTextureTest, MultisampleGenerateMipmapTest)
+{
+    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+    GLsizei size = 64;
+    // Vertex Shader source
+    constexpr char kVS[] = R"(attribute vec4 position;
+varying vec2 vTexCoord;
+
+void main()
+{
+    gl_Position = position;
+    vTexCoord   = (position.xy * 0.5) + 0.5;
+})";
+
+    // Fragment Shader source
+    constexpr char kFS[] = R"(precision mediump float;
+uniform sampler2D uTexture;
+varying vec2 vTexCoord;
+
+void main()
+{
+    gl_FragColor = texture2D(uTexture, vTexCoord);
+})";
+
+    GLProgram m2DProgram;
+    m2DProgram.makeRaster(kVS, kFS);
+    ASSERT_GL_TRUE(m2DProgram.valid());
+
+    ASSERT_GL_NO_ERROR();
+
+    // Initialize texture with blue
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size, size, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+    GLFramebuffer FBO;
+    glBindFramebuffer(GL_FRAMEBUFFER, FBO);
+    glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture, 0, 4);
+    ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
+    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
+    glClear(GL_COLOR_BUFFER_BIT);
+    glViewport(0, 0, size, size);
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    ASSERT_GL_NO_ERROR();
+
+    // Generate mipmap
+    glGenerateMipmap(GL_TEXTURE_2D);
+    ASSERT_GL_NO_ERROR();
+
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+
+    // Now draw the texture to various different sized areas.
+    clearAndDrawQuad(m2DProgram, size, size);
+    EXPECT_PIXEL_COLOR_EQ(size / 2, size / 2, GLColor::blue);
+
+    // Use mip level 1
+    clearAndDrawQuad(m2DProgram, size / 2, size / 2);
+    EXPECT_PIXEL_COLOR_EQ(size / 4, size / 4, GLColor::blue);
+
+    // Use mip level 2
+    clearAndDrawQuad(m2DProgram, size / 4, size / 4);
+    EXPECT_PIXEL_COLOR_EQ(size / 8, size / 8, GLColor::blue);
+
+    ASSERT_GL_NO_ERROR();
+}
+ANGLE_INSTANTIATE_TEST(MultisampledRenderToTextureTest,
+                       ES2_D3D9(),
+                       ES2_D3D11(),
+                       ES3_D3D11(),
+                       ES2_OPENGL(),
+                       ES3_OPENGL(),
+                       ES2_OPENGLES(),
+                       ES3_OPENGLES(),
+                       ES2_VULKAN(),
+                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST(MultisampledRenderToTextureES3Test,
+                       ES3_D3D11(),
+                       ES3_OPENGL(),
+                       ES3_OPENGLES(),
+                       ES3_VULKAN());
+}  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ObjectAllocationTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ObjectAllocationTest.cpp
index b0e59f7..9ed29d3 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ObjectAllocationTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ObjectAllocationTest.cpp
@@ -51,4 +51,4 @@
 
 }  // anonymous namespace
 
-ANGLE_INSTANTIATE_TEST(ObjectAllocationTest, ES3_OPENGL(), ES3_D3D11());
\ No newline at end of file
+ANGLE_INSTANTIATE_TEST_ES3(ObjectAllocationTest);
\ No newline at end of file
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/OcclusionQueriesTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/OcclusionQueriesTest.cpp
index 3d2f9d5..8c721e0 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/OcclusionQueriesTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/OcclusionQueriesTest.cpp
@@ -194,6 +194,9 @@
     ANGLE_SKIP_TEST_IF(GetParam() == ES2_D3D9() || GetParam() == ES2_D3D11() ||
                        GetParam() == ES3_D3D11() || GetParam() == ES2_VULKAN());
 
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
+
     glDepthMask(GL_TRUE);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 
@@ -342,12 +345,4 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(OcclusionQueriesTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(OcclusionQueriesTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PBOExtensionTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PBOExtensionTest.cpp
index 10f3ae0..97e4bbb 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PBOExtensionTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PBOExtensionTest.cpp
@@ -144,4 +144,4 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(PBOExtensionTest, ES2_D3D11(), ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(PBOExtensionTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PackUnpackTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PackUnpackTest.cpp
index fedac73..6c24826 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PackUnpackTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PackUnpackTest.cpp
@@ -141,6 +141,8 @@
 // numbers.
 TEST_P(PackUnpackTest, PackUnpackSnormNormal)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to output the same value as the input
     compareBeforeAfter(mSNormProgram, 0.5f, -0.2f);
     compareBeforeAfter(mSNormProgram, -0.35f, 0.75f);
@@ -152,6 +154,8 @@
 // numbers.
 TEST_P(PackUnpackTest, PackUnpackUnormNormal)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to output the same value as the input
     compareBeforeAfter(mUNormProgram, 0.5f, 0.2f, 0.5f, 0.2f);
     compareBeforeAfter(mUNormProgram, 0.35f, 0.75f, 0.35f, 0.75f);
@@ -163,6 +167,8 @@
 // numbers.
 TEST_P(PackUnpackTest, PackUnpackHalfNormal)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to output the same value as the input
     compareBeforeAfter(mHalfProgram, 0.5f, -0.2f);
     compareBeforeAfter(mHalfProgram, -0.35f, 0.75f);
@@ -174,6 +180,8 @@
 // floating numbers.
 TEST_P(PackUnpackTest, PackUnpackSnormSubnormal)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to output the same value as the input
     compareBeforeAfter(mSNormProgram, 0.00001f, -0.00001f);
 }
@@ -182,6 +190,8 @@
 // floating numbers.
 TEST_P(PackUnpackTest, PackUnpackUnormSubnormal)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to output the same value as the input for positive numbers and clamp
     // to [0, 1]
     compareBeforeAfter(mUNormProgram, 0.00001f, -0.00001f, 0.00001f, 0.0f);
@@ -191,6 +201,8 @@
 // numbers.
 TEST_P(PackUnpackTest, PackUnpackHalfSubnormal)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to output the same value as the input
     compareBeforeAfter(mHalfProgram, 0.00001f, -0.00001f);
 }
@@ -199,6 +211,8 @@
 // numbers.
 TEST_P(PackUnpackTest, PackUnpackSnormZero)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to output the same value as the input
     compareBeforeAfter(mSNormProgram, 0.00000f, -0.00000f);
 }
@@ -207,6 +221,8 @@
 // numbers.
 TEST_P(PackUnpackTest, PackUnpackUnormZero)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     compareBeforeAfter(mUNormProgram, 0.00000f, -0.00000f, 0.00000f, 0.00000f);
 }
 
@@ -214,6 +230,8 @@
 // numbers.
 TEST_P(PackUnpackTest, PackUnpackHalfZero)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to output the same value as the input
     compareBeforeAfter(mHalfProgram, 0.00000f, -0.00000f);
 }
@@ -222,6 +240,8 @@
 // numbers.
 TEST_P(PackUnpackTest, PackUnpackUnormOverflow)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to clamp the input to [0, 1]
     compareBeforeAfter(mUNormProgram, 67000.0f, -67000.0f, 1.0f, 0.0f);
 }
@@ -230,9 +250,11 @@
 // numbers.
 TEST_P(PackUnpackTest, PackUnpackSnormOverflow)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());
     // Expect the shader to clamp the input to [-1, 1]
     compareBeforeAfter(mSNormProgram, 67000.0f, -67000.0f, 1.0f, -1.0f);
 }
 
-ANGLE_INSTANTIATE_TEST(PackUnpackTest, ES3_OPENGL(), ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3(PackUnpackTest);
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ParallelShaderCompileTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ParallelShaderCompileTest.cpp
index 8da54e7..b3f8b38 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ParallelShaderCompileTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ParallelShaderCompileTest.cpp
@@ -389,13 +389,8 @@
     runner.run(this);
 }
 
-ANGLE_INSTANTIATE_TEST(ParallelShaderCompileTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(ParallelShaderCompileTest);
 
-ANGLE_INSTANTIATE_TEST(ParallelShaderCompileTestES31, ES31_OPENGL(), ES31_OPENGLES(), ES31_D3D11());
+ANGLE_INSTANTIATE_TEST_ES31(ParallelShaderCompileTestES31);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PathRenderingTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PathRenderingTest.cpp
index 6e6aadf..b6a3793 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PathRenderingTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PathRenderingTest.cpp
@@ -1989,22 +1989,6 @@
 
 }  // namespace
 
-ANGLE_INSTANTIATE_TEST(CHROMIUMPathRenderingTest,
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(CHROMIUMPathRenderingDrawTest,
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
-
-ANGLE_INSTANTIATE_TEST(CHROMIUMPathRenderingWithTexturingTest,
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(CHROMIUMPathRenderingTest);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(CHROMIUMPathRenderingDrawTest);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(CHROMIUMPathRenderingWithTexturingTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PbufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PbufferTest.cpp
index 5ebabda..e9a0dae 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PbufferTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PbufferTest.cpp
@@ -301,9 +301,4 @@
     glDeleteTextures(1, &texture);
 }
 
-ANGLE_INSTANTIATE_TEST(PbufferTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(PbufferTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PointSpritesTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PointSpritesTest.cpp
index 0f9a373..a157435 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/PointSpritesTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/PointSpritesTest.cpp
@@ -480,6 +480,10 @@
     // rendered at all on AMD. http://anglebug.com/2113
     ANGLE_SKIP_TEST_IF(IsAMD() && IsVulkan());
 
+    // TODO(hqle): Metal on macbook also has problem with drawing point outside framebuffer.
+    // http://anglebug.com/4135
+    ANGLE_SKIP_TEST_IF(IsMetal());
+
     GLfloat pointSizeRange[2] = {};
     glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange);
     GLfloat maxPointSize = pointSizeRange[1];
@@ -541,9 +545,4 @@
 // We test on D3D11 9_3 because the existing D3D11 PointSprite implementation
 // uses Geometry Shaders which are not supported for 9_3.
 // D3D9 and D3D11 are also tested to ensure no regressions.
-ANGLE_INSTANTIATE_TEST(PointSpritesTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(PointSpritesTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramBinaryTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramBinaryTest.cpp
index 1f3d4e1..1f87cee 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramBinaryTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramBinaryTest.cpp
@@ -274,14 +274,7 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(ProgramBinaryTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ProgramBinaryTest);
 
 class ProgramBinaryES3Test : public ANGLETest
 {
@@ -620,11 +613,7 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta);
 }
 
-ANGLE_INSTANTIATE_TEST(ProgramBinaryES3Test,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(ProgramBinaryES3Test);
 
 class ProgramBinaryES31Test : public ANGLETest
 {
@@ -650,6 +639,8 @@
     GLint binaryFormatCount = 0;
     glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &binaryFormatCount);
     ANGLE_SKIP_TEST_IF(!binaryFormatCount);
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
 
     constexpr char kCS[] =
         "#version 310 es\n"
@@ -691,6 +682,8 @@
 // Tests that saving and loading a program attached with computer shader.
 TEST_P(ProgramBinaryES31Test, ProgramBinaryWithAtomicCounterComputeShader)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsVulkan());
     // We can't run the test if no program binary formats are supported.
     GLint binaryFormatCount = 0;
     glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &binaryFormatCount);
@@ -811,7 +804,7 @@
     ASSERT_GL_NO_ERROR();
 }
 
-ANGLE_INSTANTIATE_TEST(ProgramBinaryES31Test, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES31(ProgramBinaryES31Test);
 
 class ProgramBinaryTransformFeedbackTest : public ANGLETest
 {
@@ -878,7 +871,9 @@
     ANGLE_SKIP_TEST_IF(!getAvailableProgramBinaryFormatCount());
 
     // http://anglebug.com/3690
-    ANGLE_SKIP_TEST_IF(IsAndroid() && IsPixel2() && IsVulkan());
+    ANGLE_SKIP_TEST_IF(IsAndroid() && (IsPixel2() || IsPixel2XL()) && IsVulkan());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
 
     std::vector<uint8_t> binary(0);
     GLint programLength = 0;
@@ -922,7 +917,7 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(ProgramBinaryTransformFeedbackTest, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(ProgramBinaryTransformFeedbackTest);
 
 // For the ProgramBinariesAcrossPlatforms tests, we need two sets of params:
 // - a set to save the program binary
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramInterfaceTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramInterfaceTest.cpp
index bebff37..8e19c74 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramInterfaceTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramInterfaceTest.cpp
@@ -122,6 +122,8 @@
 // Tests glGetProgramResourceLocation.
 TEST_P(ProgramInterfaceTestES31, GetResourceLocation)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr char kVS[] =
         "#version 310 es\n"
         "precision highp float;\n"
@@ -181,6 +183,8 @@
 // Tests glGetProgramResource.
 TEST_P(ProgramInterfaceTestES31, GetResource)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr char kVS[] =
         "#version 310 es\n"
         "precision highp float;\n"
@@ -1195,10 +1199,6 @@
     glDeleteProgram(program);
 }
 
-ANGLE_INSTANTIATE_TEST(ProgramInterfaceTestES31,
-                       ES31_OPENGL(),
-                       ES31_OPENGLES(),
-                       ES31_D3D11(),
-                       ES31_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES31(ProgramInterfaceTestES31);
 
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramParameterTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramParameterTest.cpp
index fe6c88e..2c82bb5 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramParameterTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramParameterTest.cpp
@@ -70,12 +70,6 @@
     glDeleteProgram(program);
 }
 
-ANGLE_INSTANTIATE_TEST(ProgramParameterTest,
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_D3D11(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES(),
-                       ES31_D3D11());
-ANGLE_INSTANTIATE_TEST(ProgramParameterTestES31, ES31_OPENGL(), ES31_OPENGLES(), ES31_D3D11());
+ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(ProgramParameterTest);
+ANGLE_INSTANTIATE_TEST_ES31(ProgramParameterTestES31);
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramPipelineTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramPipelineTest.cpp
index ae4f6cd..65351f5 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramPipelineTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramPipelineTest.cpp
@@ -105,11 +105,7 @@
     EXPECT_GL_NO_ERROR();
 }
 
-ANGLE_INSTANTIATE_TEST(ProgramPipelineTest,
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES());
-ANGLE_INSTANTIATE_TEST(ProgramPipelineTest31, ES31_OPENGL(), ES31_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(ProgramPipelineTest);
+ANGLE_INSTANTIATE_TEST_ES31(ProgramPipelineTest31);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProvokingVertexTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProvokingVertexTest.cpp
index 05840a6..e9af78b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProvokingVertexTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProvokingVertexTest.cpp
@@ -135,6 +135,9 @@
 // Ensure that any provoking vertex shenanigans still gives correct vertex streams.
 TEST_P(ProvokingVertexTest, FlatTriWithTransformFeedback)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsVulkan());
+
     // TODO(cwallez) figure out why it is broken on AMD on Mac
     ANGLE_SKIP_TEST_IF(IsOSX() && IsAMD());
 
@@ -176,6 +179,8 @@
 // Test drawing a simple line with flat shading, and different valued vertices.
 TEST_P(ProvokingVertexTest, FlatLine)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF((IsWindows() || IsLinux()) && IsVulkan());
     GLfloat halfPixel = 1.0f / static_cast<GLfloat>(getWindowWidth());
 
     GLint vertexData[]     = {1, 2};
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ReadPixelsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ReadPixelsTest.cpp
index 3c4d57a..289b0cc 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ReadPixelsTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ReadPixelsTest.cpp
@@ -695,17 +695,9 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(ReadPixelsTest, ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(ReadPixelsPBOTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(ReadPixelsPBODrawTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(ReadPixelsMultisampleTest,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(ReadPixelsTextureTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(ReadPixelsErrorTest,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(ReadPixelsTest);
+ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsPBOTest);
+ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsPBODrawTest);
+ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsMultisampleTest);
+ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsTextureTest);
+ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsErrorTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RenderbufferMultisampleTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RenderbufferMultisampleTest.cpp
index c72fdd5..d81d17b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RenderbufferMultisampleTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RenderbufferMultisampleTest.cpp
@@ -74,11 +74,5 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(RenderbufferMultisampleTest,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES31_D3D11(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(RenderbufferMultisampleTest);
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RendererTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RendererTest.cpp
index 3cb5811..4db4288 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RendererTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RendererTest.cpp
@@ -172,28 +172,5 @@
 // Select configurations (e.g. which renderer, which GLES major version) these tests should be run
 // against.
 
-ANGLE_INSTANTIATE_TEST(RendererTest,
-                       // ES2 on top of D3D9
-                       ES2_D3D9(),
-
-                       // ES on top of D3D11.
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-
-                       // ES on top of desktop OpenGL.
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-
-                       // ES on top of OpenGL ES.
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-
-                       // All ES version on top of the NULL backend.
-                       ES2_NULL(),
-                       ES3_NULL(),
-                       ES31_NULL(),
-
-                       // ES on top of Vulkan.
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31_AND_NULL(RendererTest);
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RequestExtensionTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RequestExtensionTest.cpp
index 0d87cd0..b162182 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RequestExtensionTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RequestExtensionTest.cpp
@@ -69,13 +69,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(RequestExtensionTest,
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(RequestExtensionTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustBufferAccessBehaviorTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustBufferAccessBehaviorTest.cpp
index 3629186..08917a2 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustBufferAccessBehaviorTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustBufferAccessBehaviorTest.cpp
@@ -564,17 +564,6 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(RobustBufferAccessBehaviorTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES31_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES31_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES31_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31(RobustBufferAccessBehaviorTest);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustClientMemoryTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustClientMemoryTest.cpp
index 4c43ab8b..28556c3 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustClientMemoryTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustClientMemoryTest.cpp
@@ -200,14 +200,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(RobustClientMemoryTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(RobustClientMemoryTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustResourceInitTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustResourceInitTest.cpp
index 2c08d56..09dfd8f 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustResourceInitTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustResourceInitTest.cpp
@@ -842,6 +842,8 @@
 
     // Flaky failure on Linux / NV / Vulkan when run in a sequence. http://anglebug.com/3416
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsNVIDIA() && IsLinux());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsVulkan());
 
     GLTexture tex;
     setupTexture(&tex);
@@ -1634,6 +1636,8 @@
 {
     ANGLE_SKIP_TEST_IF(!hasGLExtension());
     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
 
     constexpr int width     = 8;
     constexpr int height    = 8;
@@ -1785,6 +1789,8 @@
 TEST_P(RobustResourceInitTestES31, Multisample2DTexture)
 {
     ANGLE_SKIP_TEST_IF(!hasGLExtension());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
 
     GLTexture texture;
     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
@@ -1947,18 +1953,10 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
-ANGLE_INSTANTIATE_TEST(RobustResourceInitTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(RobustResourceInitTest);
 
-ANGLE_INSTANTIATE_TEST(RobustResourceInitTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3(RobustResourceInitTestES3);
 
-ANGLE_INSTANTIATE_TEST(RobustResourceInitTestES31, ES31_OPENGL(), ES31_D3D11());
+ANGLE_INSTANTIATE_TEST_ES31(RobustResourceInitTestES31);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SRGBFramebufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SRGBFramebufferTest.cpp
index 517e6c1..4d8ddd1 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SRGBFramebufferTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SRGBFramebufferTest.cpp
@@ -106,14 +106,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(SRGBFramebufferTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(SRGBFramebufferTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SRGBTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SRGBTextureTest.cpp
index b685295..163f71a 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SRGBTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SRGBTextureTest.cpp
@@ -363,14 +363,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(SRGBTextureTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(SRGBTextureTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SamplersTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SamplersTest.cpp
index 7e061f8..4dd63c3 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SamplersTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SamplersTest.cpp
@@ -40,6 +40,8 @@
 // Verify that samplerParameterf supports TEXTURE_MAX_ANISOTROPY_EXT valid values.
 TEST_P(SamplersTest, ValidTextureSamplerMaxAnisotropyExt)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     GLSampler sampler;
 
     // Exact min
@@ -60,6 +62,8 @@
 // GL_TEXTURE_MAX_ANISOTROPY_EXT
 TEST_P(SamplersTest, InvalidUnderTextureSamplerMaxAnisotropyExt)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     GLSampler sampler;
 
     // Under min
@@ -70,6 +74,8 @@
 // GL_TEXTURE_MAX_ANISOTROPY_EXT
 TEST_P(SamplersTest, InvalidOverTextureSamplerMaxAnisotropyExt)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     GLSampler sampler;
 
     GLfloat maxValue = 0.0f;
@@ -82,5 +88,5 @@
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
 // Samplers are only supported on ES3.
-ANGLE_INSTANTIATE_TEST(SamplersTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(SamplersTest);
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SemaphoreTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SemaphoreTest.cpp
index 0ad11d0..3c4cf12 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SemaphoreTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SemaphoreTest.cpp
@@ -65,14 +65,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(SemaphoreTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(SemaphoreTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ShaderStorageBufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ShaderStorageBufferTest.cpp
index 2ffb3a7..b3456d0 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ShaderStorageBufferTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ShaderStorageBufferTest.cpp
@@ -413,6 +413,8 @@
 // Tests reading and writing to a shader storage buffer bound at an offset.
 TEST_P(ShaderStorageBufferTest31, ShaderStorageBufferReadWriteOffset)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     constexpr char kCS[] = R"(#version 310 es
 layout(local_size_x=1, local_size_y=1, local_size_z=1) in;
 
@@ -2222,10 +2224,6 @@
     EXPECT_GL_NO_ERROR();
 }
 
-ANGLE_INSTANTIATE_TEST(ShaderStorageBufferTest31,
-                       ES31_OPENGL(),
-                       ES31_OPENGLES(),
-                       ES31_D3D11(),
-                       ES31_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES31(ShaderStorageBufferTest31);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SimpleOperationTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SimpleOperationTest.cpp
index e4e1f27..1d8c360 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SimpleOperationTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SimpleOperationTest.cpp
@@ -31,11 +31,6 @@
     gl_FragColor = vec4(0, 1, 0, 1);
 })";
 
-constexpr std::array<GLenum, 6> kCubeFaces = {
-    {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
-     GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
-     GL_TEXTURE_CUBE_MAP_NEGATIVE_Z}};
-
 class SimpleOperationTest : public ANGLETest
 {
   protected:
@@ -1085,16 +1080,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(SimpleOperationTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_D3D11_PRESENT_PATH_FAST(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES2_VULKAN_SWIFTSHADER());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(SimpleOperationTest);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SixteenBppTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SixteenBppTextureTest.cpp
index d32a9d4..5088daa 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SixteenBppTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SixteenBppTextureTest.cpp
@@ -478,13 +478,8 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(SixteenBppTextureTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(SixteenBppTextureTest);
 
-ANGLE_INSTANTIATE_TEST(SixteenBppTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3(SixteenBppTextureTestES3);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/StateChangeTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/StateChangeTest.cpp
index 516aec7..8029d64 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/StateChangeTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/StateChangeTest.cpp
@@ -491,6 +491,8 @@
 // Ensure that BlitFramebuffer syncs framebuffer changes.
 TEST_P(StateChangeTestES3, BlitFramebufferSync)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
 
     // Init first texture to red
@@ -560,6 +562,8 @@
 // Adapted partially from WebGL 2 test "renderbuffers/invalidate-framebuffer"
 TEST_P(StateChangeTestES3, IncompleteRenderbufferAttachmentInvalidateSync)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
     glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
     GLint samples = 0;
@@ -902,14 +906,30 @@
         "{\n"
         "    colorOut = varyColor;\n"
         "}";
-    ANGLE_GL_PROGRAM(dualProgram, kDualVS, kDualFS);
-    GLint positionLocation = glGetAttribLocation(dualProgram, "position");
-    ASSERT_NE(-1, positionLocation);
-    GLint colorLocation = glGetAttribLocation(dualProgram, "color");
-    ASSERT_NE(-1, colorLocation);
 
-    GLint singlePositionLocation = glGetAttribLocation(singleProgram, "position");
-    ASSERT_NE(-1, singlePositionLocation);
+    ANGLE_GL_PROGRAM(dualProgram, kDualVS, kDualFS);
+
+    // Force consistent attribute locations
+    constexpr GLint positionLocation = 0;
+    constexpr GLint colorLocation    = 1;
+
+    glBindAttribLocation(singleProgram, positionLocation, "position");
+    glBindAttribLocation(dualProgram, positionLocation, "position");
+    glBindAttribLocation(dualProgram, colorLocation, "color");
+
+    {
+        glLinkProgram(singleProgram);
+        GLint linkStatus;
+        glGetProgramiv(singleProgram, GL_LINK_STATUS, &linkStatus);
+        ASSERT_NE(linkStatus, 0);
+    }
+
+    {
+        glLinkProgram(dualProgram);
+        GLint linkStatus;
+        glGetProgramiv(dualProgram, GL_LINK_STATUS, &linkStatus);
+        ASSERT_NE(linkStatus, 0);
+    }
 
     glUseProgram(singleProgram);
 
@@ -924,8 +944,8 @@
     GLVertexArray vertexArray;
     glBindVertexArray(vertexArray);
     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
-    glVertexAttribPointer(singlePositionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
-    glEnableVertexAttribArray(singlePositionLocation);
+    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
+    glEnableVertexAttribArray(positionLocation);
 
     // Should draw red.
     glDrawArrays(GL_TRIANGLES, 0, 6);
@@ -1006,6 +1026,8 @@
 // Tests that changing an active program invalidates the sampler metadata properly.
 TEST_P(StateChangeTestES3, SamplerMetadataUpdateOnSetProgram)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
     GLVertexArray vertexArray;
     glBindVertexArray(vertexArray);
 
@@ -1046,6 +1068,8 @@
 // Tests that redefining Buffer storage syncs with the Transform Feedback object.
 TEST_P(StateChangeTestES3, RedefineTransformFeedbackBuffer)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     // Create the most simple program possible - simple a passthrough for a float attribute.
     constexpr char kVertexShader[] = R"(#version 300 es
 in float valueIn;
@@ -1173,9 +1197,6 @@
 // Draw an hourglass with a drawElements call followed by a square with drawArrays.
 TEST_P(LineLoopStateChangeTest, DrawElementsThenDrawArrays)
 {
-    // http://anglebug.com/3361
-    ANGLE_SKIP_TEST_IF(IsAMD() && IsVulkan() && IsWindows());
-
     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
     glUseProgram(program);
 
@@ -1444,6 +1465,8 @@
 // frame.
 TEST_P(SimpleStateChangeTest, DrawArraysThenDrawElements)
 {
+    // http://anglebug.com/4121
+    ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGLES());
     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
     glUseProgram(program);
 
@@ -1775,6 +1798,8 @@
 // verify all the rendering results are the same.
 TEST_P(SimpleStateChangeTest, DrawRepeatUnalignedVboChange)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader() && IsWindows());
     const int kRepeat = 2;
 
     // set up VBO, colorVBO is unaligned
@@ -1891,8 +1916,6 @@
 // Tests updating a buffer's contents while in use, without redefining it.
 TEST_P(SimpleStateChangeTest, UpdateBufferInUse)
 {
-    // tobine: Started failing w/ custom cmd buffers. http://anglebug.com/3255
-    ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsVulkan());
     std::vector<GLColor> redColorData(6, GLColor::red);
 
     GLBuffer buffer;
@@ -2229,6 +2252,8 @@
 
 void SimpleStateChangeTest::updateTextureBoundToFramebufferHelper(UpdateFunc updateFunc)
 {
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
+
     std::vector<GLColor> red(4, GLColor::red);
     std::vector<GLColor> green(4, GLColor::green);
 
@@ -2281,6 +2306,8 @@
 // Tests that TexSubImage updates are flushed before rendering.
 TEST_P(SimpleStateChangeTest, TexSubImageOnTextureBoundToFrambuffer)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
     auto updateFunc = [](GLenum textureBinding, GLTexture *tex, GLint x, GLint y,
                          const GLColor &color) {
         glBindTexture(textureBinding, *tex);
@@ -2293,6 +2320,8 @@
 // Tests that CopyTexSubImage updates are flushed before rendering.
 TEST_P(SimpleStateChangeTest, CopyTexSubImageOnTextureBoundToFrambuffer)
 {
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
+
     GLTexture copySource;
     glBindTexture(GL_TEXTURE_2D, copySource);
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
@@ -2321,6 +2350,9 @@
 // target.
 TEST_P(SimpleStateChangeTestES3, ReadFramebufferDrawFramebufferDifferentAttachments)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+
     GLRenderbuffer drawColorBuffer;
     glBindRenderbuffer(GL_RENDERBUFFER, drawColorBuffer);
     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
@@ -2774,6 +2806,8 @@
 // Tries to relink a program in use and use it again to draw something else.
 TEST_P(SimpleStateChangeTest, RelinkProgram)
 {
+    // http://anglebug.com/4121
+    ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGLES());
     const GLuint program = glCreateProgram();
 
     GLuint vs     = CompileShader(GL_VERTEX_SHADER, essl1_shaders::vs::Simple());
@@ -3159,9 +3193,6 @@
 // Test that we can alternate between image textures between different dispatchs.
 TEST_P(SimpleStateChangeTestES31, DispatchImageTextureAThenTextureBThenTextureA)
 {
-    // Fails in the last EXPECT call.  http://anglebug.com/3879
-    ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && IsAMD());
-
     std::array<GLColor, 4> colorsTexA = {
         {GLColor::cyan, GLColor::cyan, GLColor::cyan, GLColor::cyan}};
 
@@ -4359,21 +4390,14 @@
 }
 }  // anonymous namespace
 
-ANGLE_INSTANTIATE_TEST(StateChangeTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(LineLoopStateChangeTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(StateChangeRenderTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(StateChangeTestES3, ES3_D3D11(), ES3_OPENGL());
-ANGLE_INSTANTIATE_TEST(SimpleStateChangeTest, ES2_D3D11(), ES2_VULKAN(), ES2_OPENGL());
-ANGLE_INSTANTIATE_TEST(SimpleStateChangeTestES3, ES3_OPENGL(), ES3_D3D11(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(SimpleStateChangeTestES31, ES31_OPENGL(), ES31_D3D11(), ES31_VULKAN());
-ANGLE_INSTANTIATE_TEST(ValidationStateChangeTest, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(WebGL2ValidationStateChangeTest, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(ValidationStateChangeTestES31, ES31_OPENGL(), ES31_D3D11(), ES31_VULKAN());
-ANGLE_INSTANTIATE_TEST(WebGLComputeValidationStateChangeTest,
-                       ES31_D3D11(),
-                       ES31_OPENGL(),
-                       ES31_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(StateChangeTest);
+ANGLE_INSTANTIATE_TEST_ES2(LineLoopStateChangeTest);
+ANGLE_INSTANTIATE_TEST_ES2(StateChangeRenderTest);
+ANGLE_INSTANTIATE_TEST_ES3(StateChangeTestES3);
+ANGLE_INSTANTIATE_TEST_ES2(SimpleStateChangeTest);
+ANGLE_INSTANTIATE_TEST_ES3(SimpleStateChangeTestES3);
+ANGLE_INSTANTIATE_TEST_ES31(SimpleStateChangeTestES31);
+ANGLE_INSTANTIATE_TEST_ES3(ValidationStateChangeTest);
+ANGLE_INSTANTIATE_TEST_ES3(WebGL2ValidationStateChangeTest);
+ANGLE_INSTANTIATE_TEST_ES31(ValidationStateChangeTestES31);
+ANGLE_INSTANTIATE_TEST_ES31(WebGLComputeValidationStateChangeTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SwizzleTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SwizzleTest.cpp
index da1eebd..94f9442 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SwizzleTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SwizzleTest.cpp
@@ -432,7 +432,7 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, expectedUpdateData);
 }
 
-ANGLE_INSTANTIATE_TEST(SwizzleTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(SwizzleIntegerTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(SwizzleTest);
+ANGLE_INSTANTIATE_TEST_ES3(SwizzleIntegerTest);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SyncQueriesTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SyncQueriesTest.cpp
index f911550..0c4b80a 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/SyncQueriesTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/SyncQueriesTest.cpp
@@ -85,14 +85,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(SyncQueriesTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(SyncQueriesTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureExternalUpdateTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureExternalUpdateTest.cpp
index 811d97d..b8c640b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureExternalUpdateTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureExternalUpdateTest.cpp
@@ -72,14 +72,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(TextureExternalUpdateTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(TextureExternalUpdateTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureMultisampleTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureMultisampleTest.cpp
index 539aacd..d5c21b3 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureMultisampleTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureMultisampleTest.cpp
@@ -298,6 +298,8 @@
 TEST_P(TextureMultisampleTest, MultisampleTargetFramebufferTexture2D)
 {
     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     GLint samples = 1;
     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, 64, 64, GL_FALSE);
@@ -312,6 +314,8 @@
 // Tests basic functionality of glTexStorage2DMultisample.
 TEST_P(TextureMultisampleTest, ValidateTextureStorageMultisampleParameters)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
 
     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
@@ -386,6 +390,8 @@
 TEST_P(TextureMultisampleTest, GetTexLevelParameter)
 {
     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
 
     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, 1, 1, GL_TRUE);
@@ -1026,16 +1032,7 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(TextureMultisampleTest,
-                       ES3_D3D11(),
-                       ES31_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES());
-ANGLE_INSTANTIATE_TEST(NegativeTextureMultisampleTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(TextureMultisampleArrayWebGLTest,
-                       ES31_D3D11(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(TextureMultisampleTest);
+ANGLE_INSTANTIATE_TEST_ES3(NegativeTextureMultisampleTest);
+ANGLE_INSTANTIATE_TEST_ES31(TextureMultisampleArrayWebGLTest);
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureRectangleTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureRectangleTest.cpp
index cae6d34..290841b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureRectangleTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureRectangleTest.cpp
@@ -452,7 +452,7 @@
     ASSERT_GL_NO_ERROR();
 }
 
-ANGLE_INSTANTIATE_TEST(TextureRectangleTest, ES2_OPENGL(), ES3_OPENGL(), ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(TextureRectangleTestES3, ES3_OPENGL());
-ANGLE_INSTANTIATE_TEST(TextureRectangleTestES31, ES31_OPENGL());
+ANGLE_INSTANTIATE_TEST_ES2(TextureRectangleTest);
+ANGLE_INSTANTIATE_TEST_ES3(TextureRectangleTestES3);
+ANGLE_INSTANTIATE_TEST_ES31(TextureRectangleTestES31);
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureTest.cpp
index 6031f04..d3f105f 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureTest.cpp
@@ -16,6 +16,9 @@
 constexpr GLuint kPixelTolerance     = 1u;
 constexpr GLfloat kPixelTolerance32F = 0.01f;
 
+// Single compressed ETC2 block of source pixels all set red
+constexpr uint8_t kCompressedImageETC2[] = {0x7E, 0x80, 0x04, 0x7F, 0x00, 0x07, 0xE0, 0x00};
+
 // Take a pixel, and reset the components not covered by the format to default
 // values. In particular, the default value for the alpha component is 255
 // (1.0 as unsigned normalized fixed point value).
@@ -45,6 +48,30 @@
     }
 }
 
+GLColor16UI SliceFormatColor16UI(GLenum format, GLColor16UI full)
+{
+    switch (format)
+    {
+        case GL_RED:
+            return GLColor16UI(full.R, 0, 0, 0xFFFF);
+        case GL_RG:
+            return GLColor16UI(full.R, full.G, 0, 0xFFFF);
+        case GL_RGB:
+            return GLColor16UI(full.R, full.G, full.B, 0xFFFF);
+        case GL_RGBA:
+            return full;
+        case GL_LUMINANCE:
+            return GLColor16UI(full.R, full.R, full.R, 0xFFFF);
+        case GL_ALPHA:
+            return GLColor16UI(0, 0, 0, full.R);
+        case GL_LUMINANCE_ALPHA:
+            return GLColor16UI(full.R, full.R, full.R, full.G);
+        default:
+            EXPECT_TRUE(false);
+            return GLColor16UI(0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF);
+    }
+}
+
 // As above, for 32F colors
 GLColor32F SliceFormatColor32F(GLenum format, GLColor32F full)
 {
@@ -1395,6 +1422,32 @@
     }
 };
 
+class PBOCompressedTextureTest : public Texture2DTest
+{
+  protected:
+    PBOCompressedTextureTest() : Texture2DTest() {}
+
+    void testSetUp() override
+    {
+        TexCoordDrawTest::testSetUp();
+        glGenTextures(1, &mTexture2D);
+        glBindTexture(GL_TEXTURE_2D, mTexture2D);
+        EXPECT_GL_NO_ERROR();
+
+        setUpProgram();
+
+        glGenBuffers(1, &mPBO);
+    }
+
+    void testTearDown() override
+    {
+        glDeleteBuffers(1, &mPBO);
+        Texture2DTest::testTearDown();
+    }
+
+    GLuint mPBO;
+};
+
 TEST_P(Texture2DTest, NegativeAPISubImage)
 {
     glBindTexture(GL_TEXTURE_2D, mTexture2D);
@@ -1739,53 +1792,176 @@
 // initialized the image with a default color.
 TEST_P(Texture2DTest, TexStorageWithPBO)
 {
-    if (IsGLExtensionEnabled("NV_pixel_buffer_object"))
+    // http://anglebug.com/4126
+    ANGLE_SKIP_TEST_IF(IsOSX() && IsOpenGL());
+
+    if (getClientMajorVersion() < 3)
     {
-        int width  = getWindowWidth();
-        int height = getWindowHeight();
-
-        GLuint tex2D;
-        glGenTextures(1, &tex2D);
-        glActiveTexture(GL_TEXTURE0);
-        glBindTexture(GL_TEXTURE_2D, tex2D);
-
-        // Fill with red
-        std::vector<GLubyte> pixels(3 * 16 * 16);
-        for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
-        {
-            pixels[pixelId * 3 + 0] = 255;
-            pixels[pixelId * 3 + 1] = 0;
-            pixels[pixelId * 3 + 2] = 0;
-        }
-
-        // Read 16x16 region from red backbuffer to PBO
-        GLuint pbo;
-        glGenBuffers(1, &pbo);
-        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
-        glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * 16 * 16, pixels.data(), GL_STATIC_DRAW);
-
-        // ANGLE internally uses RGBA as the DirectX format for RGB images
-        // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent
-        // alpha color. The data is kept in a CPU-side image and the image is marked as dirty.
-        glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
-
-        // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
-        // glTexSubImage2D should take into account that the image is dirty.
-        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
-        setUpProgram();
-
-        glUseProgram(mProgram);
-        glUniform1i(mTexture2DUniformLocation, 0);
-        drawQuad(mProgram, "position", 0.5f);
-        glDeleteTextures(1, &tex2D);
-        glDeleteBuffers(1, &pbo);
-        EXPECT_GL_NO_ERROR();
-        EXPECT_PIXEL_EQ(3 * width / 4, 3 * height / 4, 0, 0, 0, 255);
-        EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
+        ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
+        ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
     }
+
+    const int width          = getWindowWidth();
+    const int height         = getWindowHeight();
+    const size_t pixelCount  = width * height;
+    const int componentCount = 3;
+
+    GLuint tex2D;
+    glGenTextures(1, &tex2D);
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, tex2D);
+
+    // Fill with red
+    std::vector<GLubyte> pixels(componentCount * pixelCount);
+    for (size_t pixelId = 0; pixelId < pixelCount; ++pixelId)
+    {
+        pixels[pixelId * componentCount + 0] = 255;
+        pixels[pixelId * componentCount + 1] = 0;
+        pixels[pixelId * componentCount + 2] = 0;
+    }
+
+    // Read 16x16 region from red backbuffer to PBO
+    GLuint pbo;
+    glGenBuffers(1, &pbo);
+    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
+    glBufferData(GL_PIXEL_UNPACK_BUFFER, componentCount * pixelCount, pixels.data(),
+                 GL_STATIC_DRAW);
+
+    // ANGLE internally uses RGBA as the DirectX format for RGB images
+    // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent
+    // alpha color. The data is kept in a CPU-side image and the image is marked as dirty.
+    glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, width, height);
+
+    // Initializes the color of the upper-left quadrant of pixels, leaves the other pixels
+    // untouched. glTexSubImage2D should take into account that the image is dirty.
+    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width / 2, height / 2, GL_RGB, GL_UNSIGNED_BYTE,
+                    nullptr);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+    setUpProgram();
+
+    glUseProgram(mProgram);
+    glUniform1i(mTexture2DUniformLocation, 0);
+    drawQuad(mProgram, "position", 0.5f);
+    glDeleteTextures(1, &tex2D);
+    glDeleteBuffers(1, &pbo);
+    EXPECT_GL_NO_ERROR();
+    EXPECT_PIXEL_EQ(3 * width / 4, 3 * height / 4, 0, 0, 0, 255);
+    EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
+}
+
+// Test that glTexSubImage2D combined with a PBO works properly after deleting the PBO
+// and drawing with the texture
+// Pseudo code for the follow test:
+// 1. Upload PBO to mTexture2D
+// 2. Delete PBO
+// 3. Draw with otherTexture (x5)
+// 4. Draw with mTexture2D
+// 5. Validate color output
+TEST_P(Texture2DTest, PBOWithMultipleDraws)
+{
+    if (getClientMajorVersion() < 3)
+    {
+        ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
+        ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
+    }
+
+    const GLuint width            = getWindowWidth();
+    const GLuint height           = getWindowHeight();
+    const GLuint windowPixelCount = width * height;
+    std::vector<GLColor> pixelsRed(windowPixelCount, GLColor::red);
+    std::vector<GLColor> pixelsGreen(windowPixelCount, GLColor::green);
+
+    // Create secondary draw that does not use mTexture
+    const char *vertexShaderSource   = getVertexShaderSource();
+    const char *fragmentShaderSource = getFragmentShaderSource();
+    ANGLE_GL_PROGRAM(otherProgram, vertexShaderSource, fragmentShaderSource);
+
+    GLint uniformLoc = glGetUniformLocation(otherProgram, getTextureUniformName());
+    ASSERT_NE(-1, uniformLoc);
+    glUseProgram(0);
+
+    // Create secondary Texture to draw with
+    GLTexture otherTexture;
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, otherTexture);
+    glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
+    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
+                    pixelsRed.data());
+    ASSERT_GL_NO_ERROR();
+
+    // Setup primary Texture
+    glBindTexture(GL_TEXTURE_2D, mTexture2D);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
+    ASSERT_GL_NO_ERROR();
+
+    // Setup PBO
+    GLuint pbo = 0;
+    glGenBuffers(1, &pbo);
+    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
+    glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
+                 GL_STATIC_DRAW);
+    ASSERT_GL_NO_ERROR();
+
+    // Write PBO to mTexture
+    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+    ASSERT_GL_NO_ERROR();
+    // Delete PBO as ANGLE should be properly handling refcount of this buffer
+    glDeleteBuffers(1, &pbo);
+    pixelsGreen.clear();
+
+    // Do 5 draws not involving primary texture that the PBO updated
+    glUseProgram(otherProgram);
+    glUniform1i(uniformLoc, 0);
+    glBindTexture(GL_TEXTURE_2D, otherTexture);
+    drawQuad(otherProgram, "position", 0.5f);
+    glBindTexture(GL_TEXTURE_2D, 0);
+    glUseProgram(0);
+
+    glUseProgram(otherProgram);
+    glUniform1i(uniformLoc, 0);
+    glBindTexture(GL_TEXTURE_2D, otherTexture);
+    drawQuad(otherProgram, "position", 0.5f);
+    glBindTexture(GL_TEXTURE_2D, 0);
+    glUseProgram(0);
+
+    glUseProgram(otherProgram);
+    glUniform1i(uniformLoc, 0);
+    glBindTexture(GL_TEXTURE_2D, otherTexture);
+    drawQuad(otherProgram, "position", 0.5f);
+    glBindTexture(GL_TEXTURE_2D, 0);
+    glUseProgram(0);
+
+    glUseProgram(otherProgram);
+    glUniform1i(uniformLoc, 0);
+    glBindTexture(GL_TEXTURE_2D, otherTexture);
+    drawQuad(otherProgram, "position", 0.5f);
+    glBindTexture(GL_TEXTURE_2D, 0);
+    glUseProgram(0);
+    ASSERT_GL_NO_ERROR();
+
+    std::vector<GLColor> output(windowPixelCount, GLColor::black);
+    glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
+                 output.data());
+    EXPECT_EQ(pixelsRed, output);
+
+    setUpProgram();
+    // Draw using PBO updated texture
+    glUseProgram(mProgram);
+    glUniform1i(mTexture2DUniformLocation, 0);
+    glBindTexture(GL_TEXTURE_2D, mTexture2D);
+    drawQuad(mProgram, "position", 0.5f);
+    ASSERT_GL_NO_ERROR();
+
+    std::vector<GLColor> actual(windowPixelCount, GLColor::black);
+    glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
+                 actual.data());
+    // Value should be green as it was updated during PBO transfer to mTexture
+    std::vector<GLColor> expected(windowPixelCount, GLColor::green);
+    EXPECT_EQ(expected, actual);
 }
 
 // Tests CopySubImage for float formats
@@ -2017,8 +2193,8 @@
     // TODO(geofflang): Investigate on D3D11. http://anglebug.com/2291
     ANGLE_SKIP_TEST_IF(IsD3D11());
 
-    // TODO(cnorthrop): Framebuffer level support. http://anglebug.com/3184
-    ANGLE_SKIP_TEST_IF(IsVulkan());
+    // TODO(cnorthrop): Failing on Vulkan/Windows/AMD. http://anglebug.com/3996
+    ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && IsAMD());
 
     setUpProgram();
 
@@ -2677,9 +2853,6 @@
 // samplerCubeShadow: TextureCube + SamplerComparisonState
 TEST_P(SamplerTypeMixTestES3, SamplerTypeMixDraw)
 {
-    // TODO(cnorthrop): Requires non-color staging buffer support. http://anglebug.com/3949
-    ANGLE_SKIP_TEST_IF(IsVulkan());
-
     glActiveTexture(GL_TEXTURE0);
     glBindTexture(GL_TEXTURE_2D, mTexture2D);
     GLubyte texData[4];
@@ -2715,6 +2888,8 @@
     glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT,
                     depthTexData);
 
+    // http://anglebug.com/3949: TODO: Add a DS texture case
+
     EXPECT_GL_NO_ERROR();
 
     glUseProgram(mProgram);
@@ -4000,10 +4175,9 @@
 
         drawQuad(mProgram, "position", 0.5f);
 
-        GLubyte expectedValue = static_cast<GLubyte>(pixelValue >> 8);
-        EXPECT_PIXEL_COLOR_EQ(0, 0,
-                              SliceFormatColor(format, GLColor(expectedValue, expectedValue,
-                                                               expectedValue, expectedValue)));
+        EXPECT_PIXEL_16UI_COLOR(0, 0,
+                                SliceFormatColor16UI(format, GLColor16UI(pixelValue, pixelValue,
+                                                                         pixelValue, pixelValue)));
 
         glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
         glRenderbufferStorage(GL_RENDERBUFFER, internalformat, 1, 1);
@@ -4015,13 +4189,20 @@
         glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
         glClear(GL_COLOR_BUFFER_BIT);
 
+        EXPECT_PIXEL_16UI_COLOR(
+            0, 0, SliceFormatColor16UI(format, GLColor16UI(0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF)));
+
+        glBindTexture(GL_TEXTURE_2D, mTextures[1]);
         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
 
-        EXPECT_PIXEL_COLOR_EQ(0, 0, SliceFormatColor(format, GLColor::white));
-
-        glBindFramebuffer(GL_FRAMEBUFFER, 0);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],
+                               0);
+        EXPECT_PIXEL_16UI_COLOR(
+            0, 0, SliceFormatColor16UI(format, GLColor16UI(0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF)));
 
         ASSERT_GL_NO_ERROR();
+
+        glBindFramebuffer(GL_FRAMEBUFFER, 0);
     }
 
     GLuint mTextures[3];
@@ -4032,6 +4213,12 @@
 // Test texture formats enabled by the GL_EXT_texture_norm16 extension.
 TEST_P(Texture2DNorm16TestES3, TextureNorm16Test)
 {
+    // TODO(crbug.com/angleproject/4089) Fails on Nexus5X Adreno
+    // TODO(crbug.com/1024387) Fails on Nexus6P
+    ANGLE_SKIP_TEST_IF(IsNexus5X() || IsNexus6P());
+    // TODO(crbug.com/angleproject/4089) Fails on Win Intel OpenGL driver
+    ANGLE_SKIP_TEST_IF(IsIntel() && IsOpenGL());
+
     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
 
     testNorm16Texture(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT);
@@ -4043,8 +4230,6 @@
     testNorm16Texture(GL_RGB16_SNORM_EXT, GL_RGB, GL_SHORT);
     testNorm16Texture(GL_RGBA16_SNORM_EXT, GL_RGBA, GL_SHORT);
 
-    testNorm16Render(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT);
-    testNorm16Render(GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT);
     testNorm16Render(GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT);
 }
 
@@ -4598,6 +4783,8 @@
 // Test color-renderability for ES3 float and half float textures
 TEST_P(Texture2DFloatTestES3, TextureFloatRenderTest)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsD3D9());
     // EXT_color_buffer_float covers float, half float, and 11-11-10 float formats
     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));
 
@@ -4620,6 +4807,8 @@
     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_half_float"));
     // https://crbug.com/1003971
     ANGLE_SKIP_TEST_IF(IsOzone());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsD3D9());
 
     bool atLeastOneSupported = false;
 
@@ -4977,6 +5166,10 @@
 {
     ANGLE_SKIP_TEST_IF(IsD3D11());
     ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_depth_texture") &&
+                       !IsGLExtensionEnabled("GL_OES_depth_texture"));
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsOpenGL() || IsOpenGLES());
 
     // When the depth texture is specified with unsized internalformat implementations follow
     // OES_depth_texture behavior. Otherwise they follow GLES 3.0 behavior.
@@ -5635,152 +5828,103 @@
     EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
 }
 
+// Test that uses glCompressedTexSubImage2D combined with a PBO
+TEST_P(PBOCompressedTextureTest, PBOCompressedSubImage)
+{
+    // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/3853
+    ANGLE_SKIP_TEST_IF(IsOSX() && IsDesktopOpenGL());
+    // http://anglebug.com/4115
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsDesktopOpenGL());
+    ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsDesktopOpenGL());
+
+    if (getClientMajorVersion() < 3)
+    {
+        ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
+        ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
+        ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_compressed_ETC2_RGB8_texture"));
+    }
+
+    const GLuint width  = 4u;
+    const GLuint height = 4u;
+
+    setWindowWidth(width);
+    setWindowHeight(height);
+
+    // Setup primary Texture
+    glBindTexture(GL_TEXTURE_2D, mTexture2D);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+    if (getClientMajorVersion() < 3)
+    {
+        glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_ETC2, width, height);
+    }
+    else
+    {
+        glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_ETC2, width, height);
+    }
+    ASSERT_GL_NO_ERROR();
+
+    // Setup PBO and fill it with a red
+    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, mPBO);
+    glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height / 2u, kCompressedImageETC2, GL_STATIC_DRAW);
+    ASSERT_GL_NO_ERROR();
+
+    // Write PBO to mTexture
+    glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_COMPRESSED_RGB8_ETC2,
+                              width * height / 2u, nullptr);
+    ASSERT_GL_NO_ERROR();
+
+    setUpProgram();
+    // Draw using PBO updated texture
+    glUseProgram(mProgram);
+    glUniform1i(mTexture2DUniformLocation, 0);
+    glBindTexture(GL_TEXTURE_2D, mTexture2D);
+    drawQuad(mProgram, "position", 0.5f);
+    ASSERT_GL_NO_ERROR();
+
+    EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
+    ASSERT_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(Texture2DTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(TextureCubeTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DTestWithDrawScale,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(Sampler2DAsFunctionParameterTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(SamplerArrayTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(SamplerArrayAsFunctionParameterTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture3DTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DIntegerAlpha1TestES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DUnsignedIntegerAlpha1TestES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(ShadowSamplerPlusSampler3DTestES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(SamplerTypeMixTestES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DArrayTestES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(TextureSizeTextureArrayTest, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(SamplerInStructTest,
-                       ES2_D3D11(),
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(SamplerInStructAsFunctionParameterTest,
-                       ES2_D3D11(),
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(SamplerInStructArrayAsFunctionParameterTest,
-                       ES2_D3D11(),
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(SamplerInNestedStructAsFunctionParameterTest,
-                       ES2_D3D11(),
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(SamplerInStructAndOtherVariableTest,
-                       ES2_D3D11(),
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(TextureAnisotropyTest,
-                       ES2_D3D11(),
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(TextureBorderClampTest,
-                       ES2_D3D11(),
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(TextureBorderClampTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(TextureBorderClampIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(TextureLimitsTest, ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DNorm16TestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
-ANGLE_INSTANTIATE_TEST(Texture2DRGTest,
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DFloatTestES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DFloatTestES2,
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN());
-ANGLE_INSTANTIATE_TEST(TextureCubeTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(TextureCubeIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(TextureCubeIntegerEdgeTestES3, ES3_D3D11(), ES3_OPENGL());
-ANGLE_INSTANTIATE_TEST(Texture2DIntegerProjectiveOffsetTestES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DArrayIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture3DIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(Texture2DDepthTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2(Texture2DTest);
+ANGLE_INSTANTIATE_TEST_ES2(TextureCubeTest);
+ANGLE_INSTANTIATE_TEST_ES2(Texture2DTestWithDrawScale);
+ANGLE_INSTANTIATE_TEST_ES2(Sampler2DAsFunctionParameterTest);
+ANGLE_INSTANTIATE_TEST_ES2(SamplerArrayTest);
+ANGLE_INSTANTIATE_TEST_ES2(SamplerArrayAsFunctionParameterTest);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(Texture3DTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DIntegerAlpha1TestES3);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DUnsignedIntegerAlpha1TestES3);
+ANGLE_INSTANTIATE_TEST_ES3(ShadowSamplerPlusSampler3DTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(SamplerTypeMixTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DArrayTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(TextureSizeTextureArrayTest);
+ANGLE_INSTANTIATE_TEST_ES2(SamplerInStructTest);
+ANGLE_INSTANTIATE_TEST_ES2(SamplerInStructAsFunctionParameterTest);
+ANGLE_INSTANTIATE_TEST_ES2(SamplerInStructArrayAsFunctionParameterTest);
+ANGLE_INSTANTIATE_TEST_ES2(SamplerInNestedStructAsFunctionParameterTest);
+ANGLE_INSTANTIATE_TEST_ES2(SamplerInStructAndOtherVariableTest);
+ANGLE_INSTANTIATE_TEST_ES2(TextureAnisotropyTest);
+ANGLE_INSTANTIATE_TEST_ES2(TextureBorderClampTest);
+ANGLE_INSTANTIATE_TEST_ES3(TextureBorderClampTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(TextureBorderClampIntegerTestES3);
+ANGLE_INSTANTIATE_TEST_ES2(TextureLimitsTest);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DNorm16TestES3);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(Texture2DRGTest);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DFloatTestES3);
+ANGLE_INSTANTIATE_TEST_ES2(Texture2DFloatTestES2);
+ANGLE_INSTANTIATE_TEST_ES3(TextureCubeTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DIntegerTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(TextureCubeIntegerTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(TextureCubeIntegerEdgeTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DIntegerProjectiveOffsetTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(Texture2DArrayIntegerTestES3);
+ANGLE_INSTANTIATE_TEST_ES3(Texture3DIntegerTestES3);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(Texture2DDepthTest);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(PBOCompressedTextureTest);
 
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureUploadFormatTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureUploadFormatTest.cpp
index 32c0081..623c6b8 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureUploadFormatTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureUploadFormatTest.cpp
@@ -608,11 +608,4 @@
     EXPECT_GL_NO_ERROR();
 }
 
-ANGLE_INSTANTIATE_TEST(TextureUploadFormatTest,
-                       ES3_D3D11(),
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(TextureUploadFormatTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TimerQueriesTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TimerQueriesTest.cpp
index 8caeb64..ad8198b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TimerQueriesTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TimerQueriesTest.cpp
@@ -478,6 +478,8 @@
 TEST_P(TimerQueriesTestES3, TimestampGetInteger64)
 {
     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_disjoint_timer_query"));
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsAndroid());
 
     GLint queryTimestampBits = 0;
     glGetQueryivEXT(GL_TIMESTAMP_EXT, GL_QUERY_COUNTER_BITS_EXT, &queryTimestampBits);
@@ -502,12 +504,6 @@
     EXPECT_LT(result1, result2);
 }
 
-ANGLE_INSTANTIATE_TEST(TimerQueriesTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(TimerQueriesTest);
 
-ANGLE_INSTANTIATE_TEST(TimerQueriesTestES3, ES3_D3D11(), ES3_OPENGL());
+ANGLE_INSTANTIATE_TEST_ES3(TimerQueriesTestES3);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp
index 427e6dc..876e1f5 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp
@@ -1644,16 +1644,8 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(TransformFeedbackTest,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(TransformFeedbackLifetimeTest,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(TransformFeedbackTestES31, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3(TransformFeedbackTest);
+ANGLE_INSTANTIATE_TEST_ES3(TransformFeedbackLifetimeTest);
+ANGLE_INSTANTIATE_TEST_ES31(TransformFeedbackTestES31);
 
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/UniformBufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/UniformBufferTest.cpp
index 85b54c2..0549f2f 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/UniformBufferTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/UniformBufferTest.cpp
@@ -1598,11 +1598,7 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(UniformBufferTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(UniformBufferTest31,
-                       ES31_D3D11(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES(),
-                       ES31_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(UniformBufferTest);
+ANGLE_INSTANTIATE_TEST_ES31(UniformBufferTest31);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/UniformTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/UniformTest.cpp
index 72e8778..aaf289f 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/UniformTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/UniformTest.cpp
@@ -1410,24 +1410,9 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(SimpleUniformTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(UniformTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(UniformTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
-ANGLE_INSTANTIATE_TEST(UniformTestES31, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(SimpleUniformTest);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(UniformTest);
+ANGLE_INSTANTIATE_TEST_ES3(UniformTestES3);
+ANGLE_INSTANTIATE_TEST_ES31(UniformTestES31);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/UnpackAlignmentTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/UnpackAlignmentTest.cpp
index 698f1c0..28d2847 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/UnpackAlignmentTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/UnpackAlignmentTest.cpp
@@ -297,13 +297,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(UnpackAlignmentTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_VULKAN(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(UnpackAlignmentTest);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/UnpackRowLength.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/UnpackRowLength.cpp
index a5168ff..c354fdc 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/UnpackRowLength.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/UnpackRowLength.cpp
@@ -99,14 +99,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(UnpackRowLengthTest,
-                       ES3_D3D11(),
-                       ES2_D3D11(),
-                       ES2_D3D9(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(UnpackRowLengthTest);
 
 }  // namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/VertexAttributeTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/VertexAttributeTest.cpp
index 43b309e..6078dbb 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/VertexAttributeTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/VertexAttributeTest.cpp
@@ -1203,6 +1203,9 @@
 // Verify that using a different start vertex doesn't mess up the draw.
 TEST_P(VertexAttributeTest, DrawArraysWithBufferOffset)
 {
+    // anglebug.com/4163
+    ANGLE_SKIP_TEST_IF(IsD3D11() && IsNVIDIA() && IsWindows7());
+
     // TODO(jmadill): Diagnose this failure.
     ANGLE_SKIP_TEST_IF(IsD3D11_FL93());
 
@@ -2409,41 +2412,14 @@
 // tests should be run against.
 // D3D11 Feature Level 9_3 uses different D3D formats for vertex attribs compared to Feature Levels
 // 10_0+, so we should test them separately.
-ANGLE_INSTANTIATE_TEST(VertexAttributeTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(VertexAttributeTest);
 
-ANGLE_INSTANTIATE_TEST(VertexAttributeOORTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(VertexAttributeOORTest);
 
-ANGLE_INSTANTIATE_TEST(VertexAttributeTestES3,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES3(VertexAttributeTestES3);
 
-ANGLE_INSTANTIATE_TEST(VertexAttributeTestES31,
-                       ES31_D3D11(),
-                       ES31_OPENGL(),
-                       ES31_OPENGLES(),
-                       ES31_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES31(VertexAttributeTestES31);
 
-ANGLE_INSTANTIATE_TEST(VertexAttributeCachingTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(VertexAttributeCachingTest);
 
 }  // anonymous namespace
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanExternalImageTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanExternalImageTest.cpp
index 96e093b..18a37b1 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanExternalImageTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanExternalImageTest.cpp
@@ -57,6 +57,8 @@
 // glImportMemoryFdEXT must be able to import a valid opaque fd.
 TEST_P(VulkanExternalImageTest, ShouldImportMemoryOpaqueFd)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_memory_object_fd"));
 
     VulkanExternalHelper helper;
@@ -93,6 +95,8 @@
 // glImportSemaphoreFdEXT must be able to import a valid opaque fd.
 TEST_P(VulkanExternalImageTest, ShouldImportSemaphoreOpaqueFd)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_semaphore_fd"));
 
     VulkanExternalHelper helper;
@@ -122,6 +126,8 @@
 // Test creating and clearing a simple RGBA8 texture in a opaque fd.
 TEST_P(VulkanExternalImageTest, ShouldClearOpaqueFdRGBA8)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(isSwiftshader());
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_memory_object_fd"));
 
     VulkanExternalHelper helper;
@@ -171,14 +177,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(VulkanExternalImageTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(VulkanExternalImageTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLCompatibilityTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLCompatibilityTest.cpp
index ebcc74f..b451087 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLCompatibilityTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLCompatibilityTest.cpp
@@ -584,6 +584,17 @@
         glRequestExtensionANGLE("GL_NV_pixel_buffer_object");
         EXPECT_GL_NO_ERROR();
 
+        // Create a framebuffer to read from
+        GLRenderbuffer renderbuffer;
+        glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
+        glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 1, 1);
+
+        GLFramebuffer fbo;
+        glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+                                  renderbuffer);
+        EXPECT_GL_NO_ERROR();
+
         glBindBuffer(GL_PIXEL_PACK_BUFFER, buffer);
         EXPECT_GL_NO_ERROR();
 
@@ -984,6 +995,14 @@
         glTexImage2D(GL_TEXTURE_RECTANGLE_ANGLE, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
                      nullptr);
         EXPECT_GL_NO_ERROR();
+
+        glDisableExtensionANGLE("GL_ANGLE_texture_rectangle");
+        EXPECT_GL_NO_ERROR();
+
+        EXPECT_FALSE(IsGLExtensionEnabled("GL_ANGLE_texture_rectangle"));
+
+        glBindTexture(GL_TEXTURE_RECTANGLE_ANGLE, texture);
+        EXPECT_GL_ERROR(GL_INVALID_ENUM);
     }
 }
 
@@ -3588,7 +3607,7 @@
     FillTexture2D(tex0.get(), width, height, GLColor::black, 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE);
     FillTexture2D(tex1.get(), width, height, 0x80, 0, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT,
                   GL_UNSIGNED_INT);
-    FillTexture2D(tex2.get(), width, height, 0x40, 0, GL_DEPTH_STENCIL, GL_DEPTH_STENCIL,
+    FillTexture2D(tex2.get(), width, height, 0x40, 0, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL,
                   GL_UNSIGNED_INT_24_8);
     ASSERT_GL_NO_ERROR();
 
@@ -3650,6 +3669,8 @@
 // But the level of the 3D texture != the level of the read attachment.
 TEST_P(WebGL2CompatibilityTest, NoTextureCopyingFeedbackLoopBetween3DLevels)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     GLTexture texture;
     GLFramebuffer framebuffer;
 
@@ -3669,6 +3690,8 @@
 // But the zoffset of the 3D texture != the layer of the read attachment.
 TEST_P(WebGL2CompatibilityTest, NoTextureCopyingFeedbackLoopBetween3DLayers)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan());
     GLTexture texture;
     GLFramebuffer framebuffer;
 
@@ -4623,16 +4646,7 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(WebGLCompatibilityTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLCompatibilityTest);
 
-ANGLE_INSTANTIATE_TEST(WebGL2CompatibilityTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES3(WebGL2CompatibilityTest);
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLFramebufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLFramebufferTest.cpp
index a99232e..b50c4ad 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLFramebufferTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLFramebufferTest.cpp
@@ -901,14 +901,6 @@
 }
 
 // Only run against WebGL 1 validation, since much was changed in 2.
-ANGLE_INSTANTIATE_TEST(WebGLFramebufferTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLFramebufferTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLReadOutsideFramebufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLReadOutsideFramebufferTest.cpp
index db8c613..b35722d 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLReadOutsideFramebufferTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLReadOutsideFramebufferTest.cpp
@@ -362,6 +362,8 @@
 // Check that copyTexImage2D sets (0,0,0,0) for pixels outside the framebuffer.
 TEST_P(WebGLReadOutsideFramebufferTest, CopyTexImage2D)
 {
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan() || IsD3D9() || IsD3D11());
     Main2D(&WebGLReadOutsideFramebufferTest::TestCopyTexImage2D, true);
 
     // TODO(fjhenigman): Figure out this failure.
@@ -375,25 +377,19 @@
 // the corresponding source pixel is outside the framebuffer.
 TEST_P(WebGL2ReadOutsideFramebufferTest, CopyTexSubImage3D)
 {
+    // TODO(hqle): Metal doesn't implement 3D texture yet.
+    // http://anglebug.com/4136 (ES2 renderer is mistakenly included in this test)
+    ANGLE_SKIP_TEST_IF(IsMetal());
+    // http://anglebug.com/4092
+    ANGLE_SKIP_TEST_IF(IsVulkan() || IsD3D9() || IsD3D11());
     // Robust CopyTexSubImage3D behaviour is not implemented on OpenGL.
     ANGLE_SKIP_TEST_IF(IsDesktopOpenGL() || IsOpenGLES());
 
     Main3D(&WebGLReadOutsideFramebufferTest::TestCopyTexSubImage3D, false);
 }
 
-ANGLE_INSTANTIATE_TEST(WebGLReadOutsideFramebufferTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLReadOutsideFramebufferTest);
 
-ANGLE_INSTANTIATE_TEST(WebGL2ReadOutsideFramebufferTest,
-                       ES3_D3D11(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGL2ReadOutsideFramebufferTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/AlphaFuncTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/AlphaFuncTest.cpp
index 82ed1d0..0b9e7c9 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/AlphaFuncTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/AlphaFuncTest.cpp
@@ -93,4 +93,4 @@
     EXPECT_EQ(std::numeric_limits<GLint>::max(), alphaTestVal);
 }
 
-ANGLE_INSTANTIATE_TEST(AlphaFuncTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(AlphaFuncTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/BasicDrawTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/BasicDrawTest.cpp
index c296df0..509b23b 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/BasicDrawTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/BasicDrawTest.cpp
@@ -80,4 +80,4 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
-ANGLE_INSTANTIATE_TEST(BasicDrawTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(BasicDrawTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClientActiveTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClientActiveTextureTest.cpp
index 8082d07..34a6375 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClientActiveTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClientActiveTextureTest.cpp
@@ -77,8 +77,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(ClientActiveTextureTest,
-                       ES1_D3D11(),
-                       ES1_OPENGL(),
-                       ES1_OPENGLES(),
-                       ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(ClientActiveTextureTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClientStateEnable.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClientStateEnable.cpp
index 0413d3d..b2bbf54 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClientStateEnable.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClientStateEnable.cpp
@@ -89,4 +89,4 @@
     EXPECT_GL_FALSE(glIsEnabled(GL_TEXTURE_COORD_ARRAY));
 }
 
-ANGLE_INSTANTIATE_TEST(ClientStateEnable, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(ClientStateEnable);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClipPlaneTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClipPlaneTest.cpp
index 0731834..6218039 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClipPlaneTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ClipPlaneTest.cpp
@@ -116,4 +116,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(ClipPlaneTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(ClipPlaneTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentColorTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentColorTest.cpp
index a40ead2..230740d 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentColorTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentColorTest.cpp
@@ -75,4 +75,4 @@
     EXPECT_NEAR(1.0f / 3.0f, floatColor.A, epsilon);
 }
 
-ANGLE_INSTANTIATE_TEST(CurrentColorTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(CurrentColorTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentNormalTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentNormalTest.cpp
index 6a35dfc..1bce4d8 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentNormalTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentNormalTest.cpp
@@ -66,4 +66,4 @@
     EXPECT_NEAR(1.0f / 3.0f, actualNormal[2], epsilon);
 }
 
-ANGLE_INSTANTIATE_TEST(CurrentNormalTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(CurrentNormalTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentTextureCoordsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentTextureCoordsTest.cpp
index 5ad1953..0d4ff20 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentTextureCoordsTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/CurrentTextureCoordsTest.cpp
@@ -96,8 +96,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(CurrentTextureCoordsTest,
-                       ES1_D3D11(),
-                       ES1_OPENGL(),
-                       ES1_OPENGLES(),
-                       ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(CurrentTextureCoordsTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/DrawTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/DrawTextureTest.cpp
index 22f3c53..21d696a 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/DrawTextureTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/DrawTextureTest.cpp
@@ -133,4 +133,4 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
-ANGLE_INSTANTIATE_TEST(DrawTextureTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(DrawTextureTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/FogTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/FogTest.cpp
index 10494ad..26ba9d3 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/FogTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/FogTest.cpp
@@ -130,4 +130,4 @@
     EXPECT_EQ(0.4f, fogValue[3]);
 }
 
-ANGLE_INSTANTIATE_TEST(FogTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(FogTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/LightsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/LightsTest.cpp
index 6752e3b..d413088 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/LightsTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/LightsTest.cpp
@@ -314,4 +314,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(LightsTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(LightsTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MaterialsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MaterialsTest.cpp
index fcebff6..717c237 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MaterialsTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MaterialsTest.cpp
@@ -128,4 +128,4 @@
     EXPECT_EQ(kShininessTestValue, actualShininess);
 }
 
-ANGLE_INSTANTIATE_TEST(MaterialsTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(MaterialsTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixBuiltinsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixBuiltinsTest.cpp
index 1964688..a0357d7 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixBuiltinsTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixBuiltinsTest.cpp
@@ -173,4 +173,4 @@
     EXPECT_GL_ERROR(GL_INVALID_VALUE);
 }
 
-ANGLE_INSTANTIATE_TEST(MatrixBuiltinsTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(MatrixBuiltinsTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixLoadTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixLoadTest.cpp
index 8f09be8..aa020bb 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixLoadTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixLoadTest.cpp
@@ -102,4 +102,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(MatrixLoadTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(MatrixLoadTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixModeTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixModeTest.cpp
index 3a3bb90..0b1b2fc 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixModeTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixModeTest.cpp
@@ -62,4 +62,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(MatrixModeTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(MatrixModeTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixMultTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixMultTest.cpp
index 99817f8..45b3ca6 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixMultTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixMultTest.cpp
@@ -74,4 +74,4 @@
     EXPECT_EQ(angle::Mat4(), outputMatrix);
 }
 
-ANGLE_INSTANTIATE_TEST(MatrixMultTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(MatrixMultTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixStackTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixStackTest.cpp
index 52c86b3..771d554 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixStackTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/MatrixStackTest.cpp
@@ -112,4 +112,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(MatrixStackTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(MatrixStackTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/PointParameterTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/PointParameterTest.cpp
index 45cdf70..14e5ba6 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/PointParameterTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/PointParameterTest.cpp
@@ -153,4 +153,4 @@
     EXPECT_EQ(3.0f, params[2]);
 }
 
-ANGLE_INSTANTIATE_TEST(PointParameterTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(PointParameterTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/PointSpriteTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/PointSpriteTest.cpp
index fbac388..49da7cd 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/PointSpriteTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/PointSpriteTest.cpp
@@ -84,4 +84,4 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
 }
 
-ANGLE_INSTANTIATE_TEST(PointSpriteTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(PointSpriteTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ShadeModelTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ShadeModelTest.cpp
index c45803c..3130a81 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ShadeModelTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/ShadeModelTest.cpp
@@ -68,4 +68,4 @@
     EXPECT_GLENUM_EQ(GL_SMOOTH, shadeModel);
 }
 
-ANGLE_INSTANTIATE_TEST(ShadeModelTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(ShadeModelTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureEnvTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureEnvTest.cpp
index 4aa63af..cb6c0d5 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureEnvTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureEnvTest.cpp
@@ -372,4 +372,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(TextureEnvTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(TextureEnvTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureParameterTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureParameterTest.cpp
index a629eae..cc666f9 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureParameterTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureParameterTest.cpp
@@ -111,8 +111,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(TextureParameterTest,
-                       ES1_D3D11(),
-                       ES1_OPENGL(),
-                       ES1_OPENGLES(),
-                       ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(TextureParameterTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureTargetEnableTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureTargetEnableTest.cpp
index 71f26c7..fa7dc75 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureTargetEnableTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/TextureTargetEnableTest.cpp
@@ -76,8 +76,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(TextureTargetEnableTest,
-                       ES1_D3D11(),
-                       ES1_OPENGL(),
-                       ES1_OPENGLES(),
-                       ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(TextureTargetEnableTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/VertexPointerTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/VertexPointerTest.cpp
index f62c708..10a7dbd 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/VertexPointerTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/gles1/VertexPointerTest.cpp
@@ -64,4 +64,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(VertexPointerTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES1(VertexPointerTest);
diff --git a/Source/ThirdParty/ANGLE/src/tests/gles1_conformance_tests/ConformanceTests.cpp b/Source/ThirdParty/ANGLE/src/tests/gles1_conformance_tests/ConformanceTests.cpp
index 587b2dd..12b3e28 100644
--- a/Source/ThirdParty/ANGLE/src/tests/gles1_conformance_tests/ConformanceTests.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/gles1_conformance_tests/ConformanceTests.cpp
@@ -348,8 +348,6 @@
 
 TEST_P(GLES1ConformanceTest, Scissor)
 {
-    // http://g.co/anglebug/3867
-    ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && IsIntel());
     ASSERT_NE(CONFORMANCE_TEST_ERROR, ScissorExec());
 }
 
diff --git a/Source/ThirdParty/ANGLE/src/tests/perf_tests/MultiviewPerf.cpp b/Source/ThirdParty/ANGLE/src/tests/perf_tests/MultiviewPerf.cpp
index e3f15e7..6db5f19 100644
--- a/Source/ThirdParty/ANGLE/src/tests/perf_tests/MultiviewPerf.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/perf_tests/MultiviewPerf.cpp
@@ -421,7 +421,7 @@
                             "   frag_Col3 = vert_Col3;\n"
                             "   frag_Col4 = vert_Col4;\n"
                             "   frag_Col5 = vert_Col5;\n"
-                            "    gl_Position = vPosition;\n"
+                            "   gl_Position = vPosition;\n"
                             "}\n";
 
     const std::string &fs =
diff --git a/Source/ThirdParty/ANGLE/src/tests/perf_tests/TextureUploadPerf.cpp b/Source/ThirdParty/ANGLE/src/tests/perf_tests/TextureUploadPerf.cpp
index 7bbf7aa..1e5f3a5 100644
--- a/Source/ThirdParty/ANGLE/src/tests/perf_tests/TextureUploadPerf.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/perf_tests/TextureUploadPerf.cpp
@@ -109,6 +109,69 @@
     void drawBenchmark() override;
 };
 
+class PBOSubImageBenchmark : public TextureUploadBenchmarkBase
+{
+  public:
+    PBOSubImageBenchmark() : TextureUploadBenchmarkBase("PBO") {}
+
+    void initializeBenchmark() override
+    {
+        TextureUploadBenchmarkBase::initializeBenchmark();
+
+        const auto &params = GetParam();
+
+        glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, params.baseSize, params.baseSize);
+
+        glGenBuffers(1, &mPBO);
+        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, mPBO);
+        glBufferData(GL_PIXEL_UNPACK_BUFFER, params.baseSize * params.baseSize * 4,
+                     mTextureData.data(), GL_STREAM_DRAW);
+    }
+
+    void destroyBenchmark()
+    {
+        TextureUploadBenchmarkBase::destroyBenchmark();
+        glDeleteBuffers(1, &mPBO);
+    }
+
+    void drawBenchmark() override;
+
+  private:
+    GLuint mPBO;
+};
+
+class PBOCompressedSubImageBenchmark : public TextureUploadBenchmarkBase
+{
+  public:
+    PBOCompressedSubImageBenchmark() : TextureUploadBenchmarkBase("PBOCompressed") {}
+
+    void initializeBenchmark() override
+    {
+        TextureUploadBenchmarkBase::initializeBenchmark();
+
+        const auto &params = GetParam();
+
+        glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_ETC2, params.baseSize,
+                          params.baseSize);
+
+        glGenBuffers(1, &mPBO);
+        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, mPBO);
+        glBufferData(GL_PIXEL_UNPACK_BUFFER, params.subImageSize * params.subImageSize / 2,
+                     mTextureData.data(), GL_STREAM_DRAW);
+    }
+
+    void destroyBenchmark()
+    {
+        TextureUploadBenchmarkBase::destroyBenchmark();
+        glDeleteBuffers(1, &mPBO);
+    }
+
+    void drawBenchmark() override;
+
+  private:
+    GLuint mPBO;
+};
+
 TextureUploadBenchmarkBase::TextureUploadBenchmarkBase(const char *benchmarkName)
     : ANGLERenderTest(benchmarkName, GetParam())
 {
@@ -228,6 +291,46 @@
     ASSERT_GL_NO_ERROR();
 }
 
+void PBOSubImageBenchmark::drawBenchmark()
+{
+    const auto &params = GetParam();
+
+    startGpuTimer();
+    for (unsigned int iteration = 0; iteration < params.iterationsPerStep; ++iteration)
+    {
+        glTexSubImage2D(GL_TEXTURE_2D, 0, rand() % (params.baseSize - params.subImageSize),
+                        rand() % (params.baseSize - params.subImageSize), params.subImageSize,
+                        params.subImageSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+
+        // Perform a draw just so the texture data is flushed.  With the position attributes not
+        // set, a constant default value is used, resulting in a very cheap draw.
+        glDrawArrays(GL_TRIANGLES, 0, 3);
+    }
+    stopGpuTimer();
+
+    ASSERT_GL_NO_ERROR();
+}
+
+void PBOCompressedSubImageBenchmark::drawBenchmark()
+{
+    const auto &params = GetParam();
+
+    startGpuTimer();
+    for (unsigned int iteration = 0; iteration < params.iterationsPerStep; ++iteration)
+    {
+        glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, params.subImageSize, params.subImageSize,
+                                  GL_COMPRESSED_RGB8_ETC2,
+                                  params.subImageSize * params.subImageSize / 2, 0);
+
+        // Perform a draw just so the texture data is flushed.  With the position attributes not
+        // set, a constant default value is used, resulting in a very cheap draw.
+        glDrawArrays(GL_TRIANGLES, 0, 3);
+    }
+    stopGpuTimer();
+
+    ASSERT_GL_NO_ERROR();
+}
+
 TextureUploadParams D3D11Params(bool webglCompat)
 {
     TextureUploadParams params;
@@ -252,6 +355,30 @@
     return params;
 }
 
+TextureUploadParams VulkanPBOParams(GLsizei baseSize, GLsizei subImageSize)
+{
+    TextureUploadParams params;
+    params.eglParameters = egl_platform::VULKAN();
+    params.webgl         = false;
+    params.trackGpuTime  = false;
+    params.baseSize      = baseSize;
+    params.subImageSize  = subImageSize;
+    return params;
+}
+
+TextureUploadParams ES3OpenGLPBOParams(GLsizei baseSize, GLsizei subImageSize)
+{
+    TextureUploadParams params;
+    params.eglParameters = egl_platform::OPENGL();
+    params.majorVersion  = 3;
+    params.minorVersion  = 0;
+    params.webgl         = false;
+    params.trackGpuTime  = false;
+    params.baseSize      = baseSize;
+    params.subImageSize  = subImageSize;
+    return params;
+}
+
 }  // anonymous namespace
 
 TEST_P(TextureUploadSubImageBenchmark, Run)
@@ -264,6 +391,16 @@
     run();
 }
 
+TEST_P(PBOSubImageBenchmark, Run)
+{
+    run();
+}
+
+TEST_P(PBOCompressedSubImageBenchmark, Run)
+{
+    run();
+}
+
 using namespace params;
 
 ANGLE_INSTANTIATE_TEST(TextureUploadSubImageBenchmark,
@@ -283,3 +420,11 @@
                        VulkanParams(false),
                        NullDevice(VulkanParams(false)),
                        VulkanParams(true));
+
+ANGLE_INSTANTIATE_TEST(PBOSubImageBenchmark,
+                       ES3OpenGLPBOParams(1024, 128),
+                       VulkanPBOParams(1024, 128));
+
+ANGLE_INSTANTIATE_TEST(PBOCompressedSubImageBenchmark,
+                       ES3OpenGLPBOParams(128, 128),
+                       VulkanPBOParams(128, 128));
diff --git a/Source/ThirdParty/ANGLE/src/tests/perf_tests/glmark2Benchmark.cpp b/Source/ThirdParty/ANGLE/src/tests/perf_tests/glmark2Benchmark.cpp
index 2d5e463..174fcc6 100644
--- a/Source/ThirdParty/ANGLE/src/tests/perf_tests/glmark2Benchmark.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/perf_tests/glmark2Benchmark.cpp
@@ -151,10 +151,9 @@
         }
         args.push_back(nullptr);
 
-        std::string output;
-        int exitCode;
-
-        bool success = RunApp(args, &output, nullptr, &exitCode);
+        ProcessHandle process(args, true, false);
+        ASSERT_TRUE(process && process->started());
+        ASSERT_TRUE(process->finish());
 
         // Restore the current working directory for the next tests.
         if (cwd.valid())
@@ -162,11 +161,11 @@
             SetCWD(cwd.value().c_str());
         }
 
-        ASSERT_TRUE(success);
-        ASSERT_EQ(EXIT_SUCCESS, exitCode);
+        ASSERT_EQ(EXIT_SUCCESS, process->getExitCode());
 
         if (!OneFrame())
         {
+            std::string output = process->getStdout();
             parseOutput(output, benchmarkName, completeRun);
         }
     }
diff --git a/Source/ThirdParty/ANGLE/src/tests/preprocessor_tests/extension_test.cpp b/Source/ThirdParty/ANGLE/src/tests/preprocessor_tests/extension_test.cpp
index f253778..772cd7e 100644
--- a/Source/ThirdParty/ANGLE/src/tests/preprocessor_tests/extension_test.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/preprocessor_tests/extension_test.cpp
@@ -74,8 +74,12 @@
     const char *expected = "int baz = 1;\n\n";
 
     using testing::_;
-    // Expect an error about extension pragmas after non-preprocessor tokens.
-    EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL, _, _));
+#if defined(ANGLE_PLATFORM_CHROMEOS)
+    // Directive successfully parsed.
+    EXPECT_CALL(mDirectiveHandler, handleExtension(pp::SourceLocation(0, 2), "foo", "bar"));
+#endif
+    // Expect an error (chromeos warning) about extension pragmas after non-preprocessor tokens.
+    EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1, _, _));
 
     preprocess(str, expected);
 }
@@ -92,7 +96,7 @@
     // Directive successfully parsed.
     EXPECT_CALL(mDirectiveHandler, handleVersion(pp::SourceLocation(0, 1), 300, SH_GLES2_SPEC));
     // Expect an error about extension pragmas after non-preprocessor tokens.
-    EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL, _, _));
+    EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3, _, _));
 
     preprocess(str, expected);
 }
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.cpp b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.cpp
index a762e18..6f64295 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.cpp
@@ -36,7 +36,8 @@
     if (sSavedMajorVersion == -1 || sSavedMinorVersion == -1)
     {
 #if defined(ANGLE_PLATFORM_WINDOWS)
-        OSVERSIONINFOEX version_info = {sizeof version_info};
+        OSVERSIONINFOEX version_info     = {};
+        version_info.dwOSVersionInfoSize = sizeof(version_info);
         ::GetVersionEx(reinterpret_cast<OSVERSIONINFO *>(&version_info));
         sSavedMajorVersion = version_info.dwMajorVersion;
         *majorVersion      = sSavedMajorVersion;
@@ -460,6 +461,12 @@
     return IsAndroidDevice("Pixel 2");
 }
 
+// Check whether the system is a Pixel 2XL device.
+inline bool IsPixel2XL()
+{
+    return IsAndroidDevice("Pixel 2 XL");
+}
+
 // Check whether the active GPU is a specific device based on the string device ID.
 inline bool IsDeviceIdGPU(const std::string &gpuDeviceId)
 {
@@ -517,6 +524,12 @@
     return (api == GPUTestConfig::kAPISwiftShader);
 }
 
+// Check whether the backend API has been set to Metal in the constructor
+inline bool IsMetal(const GPUTestConfig::API &api)
+{
+    return (api == GPUTestConfig::kAPIMetal);
+}
+
 }  // anonymous namespace
 
 // Load all conditions in the constructor since this data will not change during a test set.
@@ -549,27 +562,29 @@
     mConditions[kConditionRelease]         = IsRelease();
     mConditions[kConditionDebug]           = IsDebug();
     // If no API provided, pass these conditions by default
-    mConditions[kConditionD3D9]      = true;
-    mConditions[kConditionD3D11]     = true;
-    mConditions[kConditionGLDesktop] = true;
-    mConditions[kConditionGLES]      = true;
-    mConditions[kConditionVulkan]    = true;
+    mConditions[kConditionD3D9]        = true;
+    mConditions[kConditionD3D11]       = true;
+    mConditions[kConditionGLDesktop]   = true;
+    mConditions[kConditionGLES]        = true;
+    mConditions[kConditionVulkan]      = true;
     mConditions[kConditionSwiftShader] = true;
+    mConditions[kConditionMetal]       = true;
 
     mConditions[kConditionNexus5X]          = IsNexus5X();
-    mConditions[kConditionPixel2]           = IsPixel2();
+    mConditions[kConditionPixel2OrXL]       = IsPixel2() || IsPixel2XL();
     mConditions[kConditionNVIDIAQuadroP400] = IsNVIDIAQuadroP400();
 }
 
 // If the constructor is passed an API, load those conditions as well
 GPUTestConfig::GPUTestConfig(const API &api) : GPUTestConfig()
 {
-    mConditions[kConditionD3D9]      = IsD3D9(api);
-    mConditions[kConditionD3D11]     = IsD3D11(api);
-    mConditions[kConditionGLDesktop] = IsGLDesktop(api);
-    mConditions[kConditionGLES]      = IsGLES(api);
-    mConditions[kConditionVulkan]    = IsVulkan(api);
+    mConditions[kConditionD3D9]        = IsD3D9(api);
+    mConditions[kConditionD3D11]       = IsD3D11(api);
+    mConditions[kConditionGLDesktop]   = IsGLDesktop(api);
+    mConditions[kConditionGLES]        = IsGLES(api);
+    mConditions[kConditionVulkan]      = IsVulkan(api);
     mConditions[kConditionSwiftShader] = IsSwiftShader(api);
+    mConditions[kConditionMetal]       = IsMetal(api);
 }
 
 // Return a const reference to the list of all pre-calculated conditions.
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.h b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.h
index d987ddf..8249f15 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.h
+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.h
@@ -7,7 +7,7 @@
 #ifndef TEST_EXPECTATIONS_GPU_TEST_CONFIG_H_
 #define TEST_EXPECTATIONS_GPU_TEST_CONFIG_H_
 
-#include <array>
+#include <common/bitset_utils.h>
 
 namespace angle
 {
@@ -24,6 +24,7 @@
         kAPIGLES,
         kAPIVulkan,
         kAPISwiftShader,
+        kAPIMetal,
     };
 
     enum Condition
@@ -59,15 +60,16 @@
         kConditionGLDesktop,
         kConditionGLES,
         kConditionVulkan,
+        kConditionMetal,
         kConditionNexus5X,
-        kConditionPixel2,
+        kConditionPixel2OrXL,
         kConditionNVIDIAQuadroP400,
         kConditionSwiftShader,
 
         kNumberOfConditions,
     };
 
-    typedef std::array<bool, GPUTestConfig::kNumberOfConditions> ConditionArray;
+    using ConditionArray = angle::BitSet<GPUTestConfig::kNumberOfConditions>;
 
     GPUTestConfig();
     GPUTestConfig(const API &api);
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig_mac.mm b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig_mac.mm
index c34ec8a..d1bc641 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig_mac.mm
+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig_mac.mm
@@ -10,6 +10,8 @@
 
 #import <Cocoa/Cocoa.h>
 
+#include "common/apple_platform_utils.h"
+
 // OSX 10.8 deprecates Gestalt but doesn't make the operatingSystemVersion property part of the
 // public interface of NSProcessInfo until 10.10. Add a forward declaration.
 #if !defined(MAC_OS_X_VERSION_10_10) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10
@@ -27,7 +29,7 @@
     Gestalt(gestaltSystemVersionMajor, reinterpret_cast<SInt32 *>(majorVersion));
     Gestalt(gestaltSystemVersionMinor, reinterpret_cast<SInt32 *>(minorVersion));
 #else
-    if (@available(macOS 10.10, *))
+    if (ANGLE_APPLE_AVAILABLE_XC(10.10, 13.0))
     {
         NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
         *majorVersion                    = static_cast<int32_t>(version.majorVersion);
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.cpp b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.cpp
index e68c74e..173795a 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.cpp
@@ -71,6 +71,7 @@
     kConfigGLES,
     kConfigVulkan,
     kConfigSwiftShader,
+    kConfigMetal,
     // Android devices
     kConfigNexus5X,
     kConfigPixel2,
@@ -108,12 +109,28 @@
 
 struct TokenInfo
 {
+    constexpr TokenInfo()
+        : name(nullptr),
+          condition(GPUTestConfig::kConditionNone),
+          expectation(GPUTestExpectationsParser::kGpuTestPass)
+    {}
+
+    constexpr TokenInfo(const char *nameIn,
+                        GPUTestConfig::Condition conditionIn,
+                        GPUTestExpectationsParser::GPUTestExpectation expectationIn)
+        : name(nameIn), condition(conditionIn), expectation(expectationIn)
+    {}
+
+    constexpr TokenInfo(const char *nameIn, GPUTestConfig::Condition conditionIn)
+        : TokenInfo(nameIn, conditionIn, GPUTestExpectationsParser::kGpuTestPass)
+    {}
+
     const char *name;
     GPUTestConfig::Condition condition;
     GPUTestExpectationsParser::GPUTestExpectation expectation;
 };
 
-const TokenInfo kTokenData[kNumberOfTokens] = {
+constexpr TokenInfo kTokenData[kNumberOfTokens] = {
     {"xp", GPUTestConfig::kConditionWinXP},
     {"vista", GPUTestConfig::kConditionWinVista},
     {"win7", GPUTestConfig::kConditionWin7},
@@ -132,7 +149,7 @@
     {"mojave", GPUTestConfig::kConditionMacMojave},
     {"mac", GPUTestConfig::kConditionMac},
     {"linux", GPUTestConfig::kConditionLinux},
-    {"chromeos"},  // (https://anglebug.com/3363) ChromeOS not supported yet
+    {"chromeos", GPUTestConfig::kConditionNone},  // https://anglebug.com/3363 CrOS not supported
     {"android", GPUTestConfig::kConditionAndroid},
     {"nvidia", GPUTestConfig::kConditionNVIDIA},
     {"amd", GPUTestConfig::kConditionAMD},
@@ -146,19 +163,20 @@
     {"gles", GPUTestConfig::kConditionGLES},
     {"vulkan", GPUTestConfig::kConditionVulkan},
     {"swiftshader", GPUTestConfig::kConditionSwiftShader},
+    {"metal", GPUTestConfig::kConditionMetal},
     {"nexus5x", GPUTestConfig::kConditionNexus5X},
-    {"pixel2", GPUTestConfig::kConditionPixel2},
+    {"pixel2orxl", GPUTestConfig::kConditionPixel2OrXL},
     {"quadrop400", GPUTestConfig::kConditionNVIDIAQuadroP400},
     {"pass", GPUTestConfig::kConditionNone, GPUTestExpectationsParser::kGpuTestPass},
     {"fail", GPUTestConfig::kConditionNone, GPUTestExpectationsParser::kGpuTestFail},
     {"flaky", GPUTestConfig::kConditionNone, GPUTestExpectationsParser::kGpuTestFlaky},
     {"timeout", GPUTestConfig::kConditionNone, GPUTestExpectationsParser::kGpuTestTimeout},
     {"skip", GPUTestConfig::kConditionNone, GPUTestExpectationsParser::kGpuTestSkip},
-    {":"},  // kSeparatorColon
-    {"="},  // kSeparatorEqual
-    {},     // kNumberOfExactMatchTokens
-    {},     // kTokenComment
-    {},     // kTokenWord
+    {":", GPUTestConfig::kConditionNone},  // kSeparatorColon
+    {"=", GPUTestConfig::kConditionNone},  // kSeparatorEqual
+    {},                                    // kNumberOfExactMatchTokens
+    {},                                    // kTokenComment
+    {},                                    // kTokenWord
 };
 
 const char *kErrorMessage[kNumberOfErrors] = {
@@ -252,6 +270,27 @@
 
 }  // anonymous namespace
 
+const char *GetConditionName(uint32_t condition)
+{
+    if (condition == GPUTestConfig::kConditionNone)
+    {
+        return nullptr;
+    }
+
+    for (const TokenInfo &info : kTokenData)
+    {
+        if (info.condition == condition)
+        {
+            // kConditionNone is used to tag tokens that aren't conditions, but this case has been
+            // handled above.
+            ASSERT(info.condition != GPUTestConfig::kConditionNone);
+            return info.name;
+        }
+    }
+
+    return nullptr;
+}
+
 GPUTestExpectationsParser::GPUTestExpectationsParser()
 {
     // Some sanity check.
@@ -395,6 +434,7 @@
             case kConfigGLES:
             case kConfigVulkan:
             case kConfigSwiftShader:
+            case kConfigMetal:
             case kConfigNexus5X:
             case kConfigPixel2:
             case kConfigNVIDIAQuadroP400:
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.h b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.h
index 18dceaf..7c878e5 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.h
+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.h
@@ -86,6 +86,8 @@
     std::vector<std::string> mErrorMessages;
 };
 
+const char *GetConditionName(uint32_t condition);
+
 }  // namespace angle
 
 #endif  // TEST_EXPECTATIONS_GPU_TEST_EXPECTATIONS_PARSER_H_
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser_unittest.cpp b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser_unittest.cpp
index 41221d0..64751b1 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser_unittest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser_unittest.cpp
@@ -20,10 +20,7 @@
   public:
     GPUTestConfigTester()
     {
-        for (bool &condition : mConditions)
-        {
-            condition = false;
-        }
+        mConditions.reset();
         mConditions[GPUTestConfig::kConditionWin]    = true;
         mConditions[GPUTestConfig::kConditionNVIDIA] = true;
         mConditions[GPUTestConfig::kConditionD3D11]  = true;
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsTest.cpp
index e5d15e7..05df027 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsTest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsTest.cpp
@@ -27,7 +27,8 @@
         EXPECT_EQ(IsLinux(), config.getConditions()[GPUTestConfig::kConditionLinux]);
         EXPECT_EQ(IsAndroid(), config.getConditions()[GPUTestConfig::kConditionAndroid]);
         EXPECT_EQ(IsNexus5X(), config.getConditions()[GPUTestConfig::kConditionNexus5X]);
-        EXPECT_EQ(IsPixel2(), config.getConditions()[GPUTestConfig::kConditionPixel2]);
+        EXPECT_EQ((IsPixel2() || IsPixel2XL()),
+                  config.getConditions()[GPUTestConfig::kConditionPixel2OrXL]);
         EXPECT_EQ(IsIntel(), config.getConditions()[GPUTestConfig::kConditionIntel]);
         EXPECT_EQ(IsAMD(), config.getConditions()[GPUTestConfig::kConditionAMD]);
         EXPECT_EQ(IsNVIDIA(), config.getConditions()[GPUTestConfig::kConditionNVIDIA]);
@@ -42,6 +43,7 @@
         bool GLDesktop = false;
         bool GLES      = false;
         bool Vulkan    = false;
+        bool Metal     = false;
         switch (api)
         {
             case GPUTestConfig::kAPID3D9:
@@ -59,6 +61,9 @@
             case GPUTestConfig::kAPIVulkan:
                 Vulkan = true;
                 break;
+            case GPUTestConfig::kAPIMetal:
+                Metal = true;
+                break;
             case GPUTestConfig::kAPIUnknown:
             default:
                 break;
@@ -68,6 +73,7 @@
         EXPECT_EQ(GLDesktop, config.getConditions()[GPUTestConfig::kConditionGLDesktop]);
         EXPECT_EQ(GLES, config.getConditions()[GPUTestConfig::kConditionGLES]);
         EXPECT_EQ(Vulkan, config.getConditions()[GPUTestConfig::kConditionVulkan]);
+        EXPECT_EQ(Metal, config.getConditions()[GPUTestConfig::kConditionMetal]);
     }
 };
 
@@ -93,6 +99,12 @@
     validateConfigAPI(config, GPUTestConfig::kAPID3D11);
 }
 
+TEST_P(GPUTestConfigTest, GPUTestConfigConditions_Metal)
+{
+    GPUTestConfig config(GPUTestConfig::kAPIMetal);
+    validateConfigAPI(config, GPUTestConfig::kAPIMetal);
+}
+
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_GLDesktop)
 {
     GPUTestConfig config(GPUTestConfig::kAPIGLDesktop);
@@ -113,14 +125,6 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST(GPUTestConfigTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(GPUTestConfigTest);
 
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.cpp b/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.cpp
index 993185b0..db077ce 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.cpp
@@ -320,15 +320,15 @@
         std::vector<const char *> childArgs = commonArgs;
         childArgs.push_back(configStr.c_str());
 
-        int exitCode = 0;
-        if (!RunApp(childArgs, nullptr, nullptr, &exitCode))
+        ProcessHandle process(childArgs, false, false);
+        if (!process->started() || !process->finish())
         {
             std::cerr << "Launching child config " << config << " failed.\n";
         }
-        else if (exitCode != 0)
+        else if (process->getExitCode() != 0)
         {
-            std::cerr << "Child config " << config << " failed with exit code " << exitCode
-                      << ".\n";
+            std::cerr << "Child config " << config << " failed with exit code "
+                      << process->getExitCode() << ".\n";
             success = false;
         }
     }
@@ -481,7 +481,7 @@
 {
     mSetUpCalled = true;
 
-    InitCrashHandler();
+    InitCrashHandler(nullptr);
 
     gDefaultPlatformMethods.overrideWorkaroundsD3D = TestPlatform_overrideWorkaroundsD3D;
     gDefaultPlatformMethods.overrideFeaturesVk     = TestPlatform_overrideFeaturesVk;
@@ -1280,6 +1280,13 @@
     return (rendererString.find("Vulkan") != std::string::npos);
 }
 
+bool IsMetal()
+{
+    const char *renderer = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
+    std::string rendererString(renderer);
+    return (rendererString.find("Metal") != std::string::npos);
+}
+
 bool IsDebug()
 {
 #if !defined(NDEBUG)
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.h b/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.h
index 6494bfe..09f4dc0c 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.h
+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.h
@@ -123,6 +123,15 @@
     static const GLColor magenta;
 };
 
+struct GLColor16UI
+{
+    constexpr GLColor16UI() : GLColor16UI(0, 0, 0, 0) {}
+    constexpr GLColor16UI(GLushort r, GLushort g, GLushort b, GLushort a) : R(r), G(g), B(b), A(a)
+    {}
+
+    GLushort R, G, B, A;
+};
+
 struct GLColor32F
 {
     constexpr GLColor32F() : GLColor32F(0.0f, 0.0f, 0.0f, 0.0f) {}
@@ -168,6 +177,11 @@
 std::ostream &operator<<(std::ostream &ostream, const GLColor32F &color);
 GLColor32F ReadColor32F(GLint x, GLint y);
 
+constexpr std::array<GLenum, 6> kCubeFaces = {
+    {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+     GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+     GL_TEXTURE_CUBE_MAP_NEGATIVE_Z}};
+
 }  // namespace angle
 
 #define EXPECT_PIXEL_EQ(x, y, r, g, b, a) \
@@ -246,6 +260,12 @@
 #define EXPECT_PIXEL_8UI(x, y, r, g, b, a) \
     EXPECT_PIXEL_EQ_HELPER(x, y, r, g, b, a, GLubyte, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE)
 
+#define EXPECT_PIXEL_16UI(x, y, r, g, b, a) \
+    EXPECT_PIXEL_EQ_HELPER(x, y, r, g, b, a, GLushort, GL_RGBA, GL_UNSIGNED_SHORT)
+
+#define EXPECT_PIXEL_16UI_COLOR(x, y, color) \
+    EXPECT_PIXEL_16UI(x, y, color.R, color.G, color.B, color.A)
+
 #define EXPECT_PIXEL_RGB_EQUAL(x, y, r, g, b) \
     EXPECT_PIXEL_RGB_EQ_HELPER(x, y, r, g, b, GLubyte, GL_RGBA, GL_UNSIGNED_BYTE)
 
@@ -306,6 +326,12 @@
 
     static void ReleaseFixtures();
 
+    bool isSwiftshader() const
+    {
+        return mCurrentParams->eglParameters.deviceType ==
+               EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE;
+    }
+
   protected:
     void ANGLETestSetUp();
     void ANGLETestTearDown();
@@ -576,6 +602,7 @@
 bool IsOpenGL();
 bool IsNULL();
 bool IsVulkan();
+bool IsMetal();
 
 // Debug/Release
 bool IsDebug();
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_configs.cpp b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_configs.cpp
index ccd67b8..affb526 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_configs.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_configs.cpp
@@ -87,6 +87,9 @@
                 case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
                     stream << "D3D11";
                     break;
+                case EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE:
+                    stream << "Metal";
+                    break;
                 case EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE:
                     stream << "Null";
                     break;
@@ -407,6 +410,11 @@
     return EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE, EGL_DONT_CARE, EGL_DONT_CARE,
                                  EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE);
 }
+EGLPlatformParameters METAL()
+{
+    return EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE);
+}
+
 }  // namespace egl_platform
 
 // ANGLE tests platforms
@@ -660,6 +668,11 @@
     return PlatformParameters(1, 0, egl_platform::VULKAN_NULL());
 }
 
+PlatformParameters ES1_VULKAN_SWIFTSHADER()
+{
+    return PlatformParameters(1, 0, egl_platform::VULKAN_SWIFTSHADER());
+}
+
 PlatformParameters ES2_VULKAN()
 {
     return PlatformParameters(2, 0, egl_platform::VULKAN());
@@ -685,6 +698,11 @@
     return PlatformParameters(3, 0, egl_platform::VULKAN_NULL());
 }
 
+PlatformParameters ES3_VULKAN_SWIFTSHADER()
+{
+    return PlatformParameters(3, 0, egl_platform::VULKAN_SWIFTSHADER());
+}
+
 PlatformParameters ES31_VULKAN()
 {
     return PlatformParameters(3, 1, egl_platform::VULKAN());
@@ -695,6 +713,26 @@
     return PlatformParameters(3, 1, egl_platform::VULKAN_NULL());
 }
 
+PlatformParameters ES31_VULKAN_SWIFTSHADER()
+{
+    return PlatformParameters(3, 1, egl_platform::VULKAN_SWIFTSHADER());
+}
+
+PlatformParameters ES1_METAL()
+{
+    return PlatformParameters(1, 0, egl_platform::METAL());
+}
+
+PlatformParameters ES2_METAL()
+{
+    return PlatformParameters(2, 0, egl_platform::METAL());
+}
+
+PlatformParameters ES3_METAL()
+{
+    return PlatformParameters(3, 0, egl_platform::METAL());
+}
+
 PlatformParameters ES2_WGL()
 {
     return PlatformParameters(2, 0, GLESDriverType::SystemWGL);
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_configs.h b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_configs.h
index ca4d450..801582f 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_configs.h
+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_configs.h
@@ -174,13 +174,20 @@
 
 PlatformParameters ES1_VULKAN();
 PlatformParameters ES1_VULKAN_NULL();
+PlatformParameters ES1_VULKAN_SWIFTSHADER();
 PlatformParameters ES2_VULKAN();
 PlatformParameters ES2_VULKAN_NULL();
 PlatformParameters ES2_VULKAN_SWIFTSHADER();
 PlatformParameters ES3_VULKAN();
 PlatformParameters ES3_VULKAN_NULL();
+PlatformParameters ES3_VULKAN_SWIFTSHADER();
 PlatformParameters ES31_VULKAN();
 PlatformParameters ES31_VULKAN_NULL();
+PlatformParameters ES31_VULKAN_SWIFTSHADER();
+
+PlatformParameters ES1_METAL();
+PlatformParameters ES2_METAL();
+PlatformParameters ES3_METAL();
 
 PlatformParameters ES2_WGL();
 PlatformParameters ES3_WGL();
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.cpp b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.cpp
index 8a1d690..6ba8096 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.cpp
+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.cpp
@@ -26,6 +26,10 @@
 #    include "util/windows/WGLWindow.h"
 #endif  // defined(ANGLE_PLATFORM_WINDOWS)
 
+#if defined(ANGLE_PLATFORM_APPLE)
+#    include "test_utils/angle_test_instantiate_apple.h"
+#endif
+
 namespace angle
 {
 namespace
@@ -222,6 +226,11 @@
     return IsAndroidDevice("Pixel 2");
 }
 
+bool IsPixel2XL()
+{
+    return IsAndroidDevice("Pixel 2 XL");
+}
+
 bool IsNVIDIAShield()
 {
     return IsAndroidDevice("SHIELD Android TV");
@@ -295,6 +304,7 @@
         }
     }
 
+#if defined(ANGLE_PLATFORM_APPLE)
     if (IsOSX())
     {
         // We do not support non-ANGLE bindings on OSX.
@@ -309,9 +319,19 @@
             return false;
         }
 
-        // Currently we only support the OpenGL back-end on OSX.
-        return (param.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE);
+        if (param.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE &&
+            (!IsMetalRendererAvailable() || IsIntel(vendorID)))
+        {
+            // TODO(hqle): Intel metal tests seem to have problems. Disable for now.
+            // http://anglebug.com/4133
+            return false;
+        }
+
+        // Currently we only support the OpenGL & Metal back-end on OSX.
+        return (param.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE ||
+                param.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE);
     }
+#endif  // #if defined(ANGLE_PLATFORM_APPLE)
 
     if (IsFuchsia())
     {
@@ -449,6 +469,22 @@
         case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE:
 #if !defined(ANGLE_ENABLE_VULKAN)
             return false;
+#elif defined(ANGLE_IS_32_BIT_CPU)
+            // http://anglebug.com/4092
+            //  Currently hitting crashes in SwS w/ 32-bit Windows so skipping for now
+            if (IsWindows() && (param.eglParameters.deviceType ==
+                                EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE))
+            {
+                return false;
+            }
+            break;
+#else
+            break;
+#endif
+
+        case EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE:
+#if !defined(ANGLE_ENABLE_METAL)
+            return false;
 #else
             break;
 #endif
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.h b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.h
index 910e7d3..d58f3b6 100644
--- a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.h
+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.h
@@ -32,6 +32,7 @@
 bool IsNexus9();
 bool IsPixelXL();
 bool IsPixel2();
+bool IsPixel2XL();
 bool IsNVIDIAShield();
 
 // Desktop devices.
@@ -88,8 +89,9 @@
     }
 };
 
-#define ANGLE_INSTANTIATE_TEST_PLATFORMS(testName) \
-    testing::ValuesIn(::angle::FilterTestParams(testName##params, ArraySize(testName##params)))
+#define ANGLE_INSTANTIATE_TEST_PLATFORMS(testName, ...)                        \
+    testing::ValuesIn(::angle::FilterTestParams(testName##__VA_ARGS__##params, \
+                                                ArraySize(testName##__VA_ARGS__##params)))
 
 // Instantiate the test once for each extra argument. The types of all the
 // arguments must match, and getRenderer must be implemented for that type.
@@ -98,6 +100,71 @@
     INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \
                              testing::PrintToStringParamName())
 
+#define ANGLE_ALL_TEST_PLATFORMS_ES1 \
+    ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN(), ES1_VULKAN_SWIFTSHADER()
+
+#define ANGLE_ALL_TEST_PLATFORMS_ES2 \
+    ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN(), ES2_VULKAN_SWIFTSHADER()
+
+#define ANGLE_ALL_TEST_PLATFORMS_ES3 \
+    ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN(), ES3_VULKAN_SWIFTSHADER()
+
+#define ANGLE_ALL_TEST_PLATFORMS_ES31 \
+    ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES(), ES31_VULKAN(), ES31_VULKAN_SWIFTSHADER()
+
+#define ANGLE_ALL_TEST_PLATFORMS_NULL ES2_NULL(), ES3_NULL(), ES31_NULL()
+
+// Instantiate the test once for each GLES1 platform
+#define ANGLE_INSTANTIATE_TEST_ES1(testName)                                         \
+    const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES1};    \
+    INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \
+                             testing::PrintToStringParamName())
+
+// Instantiate the test once for each GLES2 platform
+#define ANGLE_INSTANTIATE_TEST_ES2(testName)                                         \
+    const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES2};    \
+    INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \
+                             testing::PrintToStringParamName())
+
+// Instantiate the test once for each GLES3 platform
+#define ANGLE_INSTANTIATE_TEST_ES3(testName)                                         \
+    const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES3};    \
+    INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \
+                             testing::PrintToStringParamName())
+
+// Instantiate the test once for each GLES31 platform
+#define ANGLE_INSTANTIATE_TEST_ES31(testName)                                        \
+    const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES31};   \
+    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,     \
+                                                   ANGLE_ALL_TEST_PLATFORMS_ES3};    \
+    INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \
+                             testing::PrintToStringParamName())
+
+#define ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31(testName)                        \
+    const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES2,     \
+                                                   ANGLE_ALL_TEST_PLATFORMS_ES3,     \
+                                                   ANGLE_ALL_TEST_PLATFORMS_ES31};   \
+    INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \
+                             testing::PrintToStringParamName())
+
+#define ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31_AND_NULL(testName)                             \
+    const PlatformParameters testName##params[] = {                                                \
+        ANGLE_ALL_TEST_PLATFORMS_ES2, ANGLE_ALL_TEST_PLATFORMS_ES3, ANGLE_ALL_TEST_PLATFORMS_ES31, \
+        ANGLE_ALL_TEST_PLATFORMS_NULL};                                                            \
+    INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName),               \
+                             testing::PrintToStringParamName())
+
+#define ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(testName)                                \
+    const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES3,     \
+                                                   ANGLE_ALL_TEST_PLATFORMS_ES31};   \
+    INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \
+                             testing::PrintToStringParamName())
+
 // Instantiate the test for a combination of N parameters and the enumeration of platforms in the
 // extra args, similar to ANGLE_INSTANTIATE_TEST.  The macros are defined only for the Ns currently
 // in use, and can be expanded as necessary.
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate_apple.h b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate_apple.h
new file mode 100644
index 0000000..0a29a3a
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate_apple.h
@@ -0,0 +1,19 @@
+//
+// 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.
+//
+// This file includes APIs to detect whether certain Apple renderer is availabe for testing.
+//
+
+#ifndef ANGLE_TEST_INSTANTIATE_APPLE_H_
+#define ANGLE_TEST_INSTANTIATE_APPLE_H_
+
+namespace angle
+{
+
+bool IsMetalRendererAvailable();
+
+}  // namespace angle
+
+#endif  // ANGLE_TEST_INSTANTIATE_APPLE_H_
diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate_apple.mm b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate_apple.mm
new file mode 100644
index 0000000..f8e7cd8
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate_apple.mm
@@ -0,0 +1,27 @@
+//
+// 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.
+//
+// This file includes APIs to detect whether certain Apple renderer is availabe for testing.
+//
+
+#include "test_utils/angle_test_instantiate_apple.h"
+
+#include "common/apple_platform_utils.h"
+
+namespace angle
+{
+
+bool IsMetalRendererAvailable()
+{
+    // NOTE(hqle): This code is currently duplicated with rx::IsMetalDisplayAvailable().
+    // Consider move it to a common source code accessible to both libANGLE and test apps.
+    if (ANGLE_APPLE_AVAILABLE_XCI(10.13, 13.0, 11))
+    {
+        return true;
+    }
+    return false;
+}
+
+}  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/src/third_party/compiler/README.chromium b/Source/ThirdParty/ANGLE/src/third_party/compiler/README.chromium
index e69de29..4fdf757 100644
--- a/Source/ThirdParty/ANGLE/src/third_party/compiler/README.chromium
+++ b/Source/ThirdParty/ANGLE/src/third_party/compiler/README.chromium
@@ -0,0 +1,12 @@
+Name: ANGLE array bounds clamper from WebKit
+Short Name: WebKit
+URL: http://webkit.org
+Version: 0
+License: BSD
+Security Critical: yes
+
+Description:
+Implements clamping of array indexing expressions during shader translation.
+
+Local Modifications:
+None
diff --git a/Source/ThirdParty/ANGLE/third_party/VK-GL-CTS/README.angle b/Source/ThirdParty/ANGLE/third_party/VK-GL-CTS/README.angle
new file mode 100644
index 0000000..1fda485
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/third_party/VK-GL-CTS/README.angle
@@ -0,0 +1,15 @@
+Name: Khronos dEQP / CTS
+Short Name: VK-GL-CTS
+Version: 1.0
+URL: https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS
+SOURCE CODE: git clone -b VK-GL-CTS https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS
+Date: 20/06/2016
+Revision: f4f3d8079e7a37d7675ab93583e6438d0bca0e58
+Security Critical: no
+License: Apache 2.0
+License File: LICENSE
+
+Description:
+VK-GL-CTS (formally dEQP) is a set of tests and testing tools for GPUs and their drivers. It
+currently supports OpenGL ES 2.0 - 3.1 & AEP, EGL and Vulkan (though ANGLE only uses the GLES
+pieces). The dEQP has been part of the Android CTS since the L release.
diff --git a/Source/ThirdParty/ANGLE/third_party/deqp/README.angle b/Source/ThirdParty/ANGLE/third_party/deqp/README.angle
deleted file mode 100644
index 40bc066..0000000
--- a/Source/ThirdParty/ANGLE/third_party/deqp/README.angle
+++ /dev/null
@@ -1,13 +0,0 @@
-Name: drawElements Quality Program
-Short Name: dEQP
-Version: 1.0
-URL: https://source.android.com/devices/graphics/testing.html
-SOURCE CODE: git clone -b deqp-dev https://android.googlesource.com/platform/external/deqp/
-Date: 20/06/2016
-Revision: f4f3d8079e7a37d7675ab93583e6438d0bca0e58
-Security Critical: no
-License: Apache 2.0
-License File: LICENSE
-
-Description:
-dEQP is a set of tests and testing tools for GPUs and their drivers. It currently supports OpenGL ES 2.0 - 3.1 & AEP and EGL. The dEQP has been part of the Android CTS since the L release.
diff --git a/Source/ThirdParty/ANGLE/third_party/googletest/README.angle b/Source/ThirdParty/ANGLE/third_party/googletest/README.angle
deleted file mode 100644
index 76a0cb4..0000000
--- a/Source/ThirdParty/ANGLE/third_party/googletest/README.angle
+++ /dev/null
@@ -1,7 +0,0 @@
-Name: Google Test: Google's C++ Testing Framework
-Short Name: googletest
-URL: https://github.com/google/googletest.git
-Version: 1.8.0.git-7f8fefabedf2965980585be8c2bff97458f28e0b
-License: BSD
-License File: NOT_SHIPPED
-Security critical: no
diff --git a/Source/ThirdParty/ANGLE/third_party/libpng/BUILD.gn b/Source/ThirdParty/ANGLE/third_party/libpng/BUILD.gn
index e570159..89bdd63 100644
--- a/Source/ThirdParty/ANGLE/third_party/libpng/BUILD.gn
+++ b/Source/ThirdParty/ANGLE/third_party/libpng/BUILD.gn
@@ -24,6 +24,13 @@
     "src/pngwtran.c",
     "src/pngwutil.c",
   ]
+  if (target_cpu == "arm") {
+    sources += [
+      "src/arm/arm_init.c",
+      "src/arm/filter_neon.S",
+      "src/arm/filter_neon_intrinsics.c",
+    ]
+  }
   if (is_win) {
     cflags = [ "/wd4028" ]
   }
diff --git a/Source/ThirdParty/ANGLE/third_party/spirv-cross/README.angle b/Source/ThirdParty/ANGLE/third_party/spirv-cross/README.angle
new file mode 100644
index 0000000..9e9f1d9
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/third_party/spirv-cross/README.angle
@@ -0,0 +1,10 @@
+Name: Khronos SPIRV-Cross
+Short Name: spirv-cross
+URL: https://github.com/KhronosGroup/SPIRV-Cross
+Version: N/A
+Security Critical: yes
+License: Apache 2.0
+License File: LICENSE
+
+Description:
+A tool designed for parsing and converting SPIR-V to other shader languages.
\ No newline at end of file
diff --git a/Source/ThirdParty/ANGLE/util/OSWindow.h b/Source/ThirdParty/ANGLE/util/OSWindow.h
index 828b48e..671270f 100644
--- a/Source/ThirdParty/ANGLE/util/OSWindow.h
+++ b/Source/ThirdParty/ANGLE/util/OSWindow.h
@@ -25,8 +25,8 @@
     static OSWindow *New();
     static void Delete(OSWindow **osWindow);
 
-    virtual bool initialize(const std::string &name, int width, int height)       = 0;
-    virtual void destroy()                                                        = 0;
+    virtual bool initialize(const std::string &name, int width, int height) = 0;
+    virtual void destroy()                                                  = 0;
 
     int getX() const;
     int getY() const;
@@ -66,7 +66,6 @@
   protected:
     OSWindow();
     virtual ~OSWindow();
-    friend ANGLE_UTIL_EXPORT void FreeOSWindow(OSWindow *window);
 
     int mX;
     int mY;
diff --git a/Source/ThirdParty/ANGLE/util/egl_loader_autogen.cpp b/Source/ThirdParty/ANGLE/util/egl_loader_autogen.cpp
index 45f4be3..bb9457d 100644
--- a/Source/ThirdParty/ANGLE/util/egl_loader_autogen.cpp
+++ b/Source/ThirdParty/ANGLE/util/egl_loader_autogen.cpp
@@ -76,6 +76,7 @@
 ANGLE_UTIL_EXPORT PFNEGLCREATESTREAMPRODUCERD3DTEXTUREANGLEPROC
     eglCreateStreamProducerD3DTextureANGLE;
 ANGLE_UTIL_EXPORT PFNEGLSTREAMPOSTD3DTEXTUREANGLEPROC eglStreamPostD3DTextureANGLE;
+ANGLE_UTIL_EXPORT PFNEGLSWAPBUFFERSWITHFRAMETOKENANGLEPROC eglSwapBuffersWithFrameTokenANGLE;
 ANGLE_UTIL_EXPORT PFNEGLGETSYNCVALUESCHROMIUMPROC eglGetSyncValuesCHROMIUM;
 ANGLE_UTIL_EXPORT PFNEGLQUERYDEVICEATTRIBEXTPROC eglQueryDeviceAttribEXT;
 ANGLE_UTIL_EXPORT PFNEGLQUERYDEVICESTRINGEXTPROC eglQueryDeviceStringEXT;
@@ -210,6 +211,8 @@
             loadProc("eglCreateStreamProducerD3DTextureANGLE"));
     eglStreamPostD3DTextureANGLE = reinterpret_cast<PFNEGLSTREAMPOSTD3DTEXTUREANGLEPROC>(
         loadProc("eglStreamPostD3DTextureANGLE"));
+    eglSwapBuffersWithFrameTokenANGLE = reinterpret_cast<PFNEGLSWAPBUFFERSWITHFRAMETOKENANGLEPROC>(
+        loadProc("eglSwapBuffersWithFrameTokenANGLE"));
     eglGetSyncValuesCHROMIUM =
         reinterpret_cast<PFNEGLGETSYNCVALUESCHROMIUMPROC>(loadProc("eglGetSyncValuesCHROMIUM"));
     eglQueryDeviceAttribEXT =
diff --git a/Source/ThirdParty/ANGLE/util/egl_loader_autogen.h b/Source/ThirdParty/ANGLE/util/egl_loader_autogen.h
index a21ee1f..2946a94 100644
--- a/Source/ThirdParty/ANGLE/util/egl_loader_autogen.h
+++ b/Source/ThirdParty/ANGLE/util/egl_loader_autogen.h
@@ -83,6 +83,7 @@
 ANGLE_UTIL_EXPORT extern PFNEGLCREATESTREAMPRODUCERD3DTEXTUREANGLEPROC
     eglCreateStreamProducerD3DTextureANGLE;
 ANGLE_UTIL_EXPORT extern PFNEGLSTREAMPOSTD3DTEXTUREANGLEPROC eglStreamPostD3DTextureANGLE;
+ANGLE_UTIL_EXPORT extern PFNEGLSWAPBUFFERSWITHFRAMETOKENANGLEPROC eglSwapBuffersWithFrameTokenANGLE;
 ANGLE_UTIL_EXPORT extern PFNEGLGETSYNCVALUESCHROMIUMPROC eglGetSyncValuesCHROMIUM;
 ANGLE_UTIL_EXPORT extern PFNEGLQUERYDEVICEATTRIBEXTPROC eglQueryDeviceAttribEXT;
 ANGLE_UTIL_EXPORT extern PFNEGLQUERYDEVICESTRINGEXTPROC eglQueryDeviceStringEXT;
diff --git a/Source/ThirdParty/ANGLE/util/fuchsia/ScenicWindow.cpp b/Source/ThirdParty/ANGLE/util/fuchsia/ScenicWindow.cpp
index 008dac3..7507352 100644
--- a/Source/ThirdParty/ANGLE/util/fuchsia/ScenicWindow.cpp
+++ b/Source/ThirdParty/ANGLE/util/fuchsia/ScenicWindow.cpp
@@ -18,7 +18,6 @@
 #include <lib/fidl/cpp/interface_request.h>
 #include <lib/ui/scenic/cpp/view_token_pair.h>
 #include <lib/zx/channel.h>
-#include <vulkan/vulkan.h>
 #include <zircon/status.h>
 
 #include "common/debug.h"
@@ -26,36 +25,6 @@
 namespace
 {
 
-uint32_t GetImagePipeSwapchainLayerImplementationVersion()
-{
-    uint32_t numInstanceLayers = 0;
-    VkResult result            = vkEnumerateInstanceLayerProperties(&numInstanceLayers, nullptr);
-    if (result != VK_SUCCESS)
-    {
-        return 0u;
-    }
-
-    std::vector<VkLayerProperties> instanceLayers(numInstanceLayers);
-    result = vkEnumerateInstanceLayerProperties(&numInstanceLayers, instanceLayers.data());
-    if (result != VK_SUCCESS)
-    {
-        return 0u;
-    }
-
-    uint32_t imagePipeSwapchainImplementationVersion = 0;
-    const std::string layerName                      = "VK_LAYER_FUCHSIA_imagepipe_swapchain";
-    for (const VkLayerProperties &layerProperty : instanceLayers)
-    {
-        if (layerName.compare(layerProperty.layerName) != 0)
-            continue;
-        imagePipeSwapchainImplementationVersion = layerProperty.implementationVersion;
-        break;
-    }
-
-    ASSERT(imagePipeSwapchainImplementationVersion > 0u);
-    return imagePipeSwapchainImplementationVersion;
-}
-
 async::Loop *GetDefaultLoop()
 {
     static async::Loop *defaultLoop = new async::Loop(&kAsyncLoopConfigAttachToCurrentThread);
@@ -138,20 +107,11 @@
 
 void ScenicWindow::resetNativeWindow()
 {
-    zx_handle_t imagePipeHandle = 0;
-    uint32_t imagePipeId        = mScenicSession.AllocResourceId();
-    if (GetImagePipeSwapchainLayerImplementationVersion() > 1u)
-    {
-        fuchsia::images::ImagePipe2Ptr imagePipe;
-        mScenicSession.Enqueue(scenic::NewCreateImagePipe2Cmd(imagePipeId, imagePipe.NewRequest()));
-        imagePipeHandle = imagePipe.Unbind().TakeChannel().release();
-    }
-    else
-    {
-        fuchsia::images::ImagePipePtr imagePipe;
-        mScenicSession.Enqueue(scenic::NewCreateImagePipeCmd(imagePipeId, imagePipe.NewRequest()));
-        imagePipeHandle = imagePipe.Unbind().TakeChannel().release();
-    }
+    fuchsia::images::ImagePipe2Ptr imagePipe;
+    uint32_t imagePipeId = mScenicSession.AllocResourceId();
+    mScenicSession.Enqueue(scenic::NewCreateImagePipe2Cmd(imagePipeId, imagePipe.NewRequest()));
+    zx_handle_t imagePipeHandle = imagePipe.Unbind().TakeChannel().release();
+
     mMaterial.SetTexture(imagePipeId);
     mScenicSession.ReleaseResource(imagePipeId);
     mScenicSession.Present(0, [](fuchsia::images::PresentationInfo info) {});
diff --git a/Source/ThirdParty/ANGLE/util/fuchsia/ScenicWindow.h b/Source/ThirdParty/ANGLE/util/fuchsia/ScenicWindow.h
index ac2cd8e..e8e14a92 100644
--- a/Source/ThirdParty/ANGLE/util/fuchsia/ScenicWindow.h
+++ b/Source/ThirdParty/ANGLE/util/fuchsia/ScenicWindow.h
@@ -10,6 +10,13 @@
 #ifndef UTIL_FUCHSIA_SCENIC_WINDOW_H
 #define UTIL_FUCHSIA_SCENIC_WINDOW_H
 
+#include "common/debug.h"
+#include "util/OSWindow.h"
+#include "util/util_export.h"
+
+// Disable ANGLE-specific warnings that pop up in fuchsia headers.
+ANGLE_DISABLE_DESTRUCTOR_OVERRIDE_WARNING
+
 #include <fuchsia/ui/policy/cpp/fidl.h>
 #include <fuchsia/ui/scenic/cpp/fidl.h>
 #include <fuchsia_egl.h>
@@ -20,8 +27,7 @@
 #include <zircon/types.h>
 #include <string>
 
-#include "util/OSWindow.h"
-#include "util/util_export.h"
+ANGLE_REENABLE_DESTRUCTOR_OVERRIDE_WARNING
 
 struct FuchsiaEGLWindowDeleter
 {
@@ -32,7 +38,7 @@
 {
   public:
     ScenicWindow();
-    ~ScenicWindow();
+    ~ScenicWindow() override;
 
     // OSWindow:
     bool initialize(const std::string &name, int width, int height) override;
diff --git a/Source/ThirdParty/ANGLE/util/gles_loader_autogen.cpp b/Source/ThirdParty/ANGLE/util/gles_loader_autogen.cpp
index 99a1595..fd8e377 100644
--- a/Source/ThirdParty/ANGLE/util/gles_loader_autogen.cpp
+++ b/Source/ThirdParty/ANGLE/util/gles_loader_autogen.cpp
@@ -424,6 +424,8 @@
 ANGLE_UTIL_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC glBlitFramebufferANGLE;
 ANGLE_UTIL_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC
     glRenderbufferStorageMultisampleANGLE;
+ANGLE_UTIL_EXPORT PFNGLGETRENDERBUFFERIMAGEANGLEPROC glGetRenderbufferImageANGLE;
+ANGLE_UTIL_EXPORT PFNGLGETTEXIMAGEANGLEPROC glGetTexImageANGLE;
 ANGLE_UTIL_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC glDrawArraysInstancedANGLE;
 ANGLE_UTIL_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC glDrawElementsInstancedANGLE;
 ANGLE_UTIL_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC glVertexAttribDivisorANGLE;
@@ -432,6 +434,7 @@
 ANGLE_UTIL_EXPORT PFNGLMULTIDRAWELEMENTSANGLEPROC glMultiDrawElementsANGLE;
 ANGLE_UTIL_EXPORT PFNGLMULTIDRAWELEMENTSINSTANCEDANGLEPROC glMultiDrawElementsInstancedANGLE;
 ANGLE_UTIL_EXPORT PFNGLPROVOKINGVERTEXANGLEPROC glProvokingVertexANGLE;
+ANGLE_UTIL_EXPORT PFNGLDISABLEEXTENSIONANGLEPROC glDisableExtensionANGLE;
 ANGLE_UTIL_EXPORT PFNGLREQUESTEXTENSIONANGLEPROC glRequestExtensionANGLE;
 ANGLE_UTIL_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLEPROC glCompressedTexImage2DRobustANGLE;
 ANGLE_UTIL_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DROBUSTANGLEPROC glCompressedTexImage3DRobustANGLE;
@@ -1131,6 +1134,9 @@
 ANGLE_UTIL_EXPORT PFNGLBLITFRAMEBUFFERANGLECONTEXTANGLEPROC glBlitFramebufferANGLEContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLECONTEXTANGLEPROC
     glRenderbufferStorageMultisampleANGLEContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLGETRENDERBUFFERIMAGEANGLECONTEXTANGLEPROC
+    glGetRenderbufferImageANGLEContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLGETTEXIMAGEANGLECONTEXTANGLEPROC glGetTexImageANGLEContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLECONTEXTANGLEPROC
     glDrawArraysInstancedANGLEContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLECONTEXTANGLEPROC
@@ -1144,6 +1150,7 @@
 ANGLE_UTIL_EXPORT PFNGLMULTIDRAWELEMENTSINSTANCEDANGLECONTEXTANGLEPROC
     glMultiDrawElementsInstancedANGLEContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLPROVOKINGVERTEXANGLECONTEXTANGLEPROC glProvokingVertexANGLEContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLDISABLEEXTENSIONANGLECONTEXTANGLEPROC glDisableExtensionANGLEContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLREQUESTEXTENSIONANGLECONTEXTANGLEPROC glRequestExtensionANGLEContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLECONTEXTANGLEPROC
     glCompressedTexImage2DRobustANGLEContextANGLE;
@@ -2092,6 +2099,10 @@
     glRenderbufferStorageMultisampleANGLE =
         reinterpret_cast<PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC>(
             loadProc("glRenderbufferStorageMultisampleANGLE"));
+    glGetRenderbufferImageANGLE = reinterpret_cast<PFNGLGETRENDERBUFFERIMAGEANGLEPROC>(
+        loadProc("glGetRenderbufferImageANGLE"));
+    glGetTexImageANGLE =
+        reinterpret_cast<PFNGLGETTEXIMAGEANGLEPROC>(loadProc("glGetTexImageANGLE"));
     glDrawArraysInstancedANGLE =
         reinterpret_cast<PFNGLDRAWARRAYSINSTANCEDANGLEPROC>(loadProc("glDrawArraysInstancedANGLE"));
     glDrawElementsInstancedANGLE = reinterpret_cast<PFNGLDRAWELEMENTSINSTANCEDANGLEPROC>(
@@ -2108,6 +2119,8 @@
         loadProc("glMultiDrawElementsInstancedANGLE"));
     glProvokingVertexANGLE =
         reinterpret_cast<PFNGLPROVOKINGVERTEXANGLEPROC>(loadProc("glProvokingVertexANGLE"));
+    glDisableExtensionANGLE =
+        reinterpret_cast<PFNGLDISABLEEXTENSIONANGLEPROC>(loadProc("glDisableExtensionANGLE"));
     glRequestExtensionANGLE =
         reinterpret_cast<PFNGLREQUESTEXTENSIONANGLEPROC>(loadProc("glRequestExtensionANGLE"));
     glCompressedTexImage2DRobustANGLE = reinterpret_cast<PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLEPROC>(
@@ -3473,6 +3486,11 @@
     glRenderbufferStorageMultisampleANGLEContextANGLE =
         reinterpret_cast<PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLECONTEXTANGLEPROC>(
             loadProc("glRenderbufferStorageMultisampleANGLEContextANGLE"));
+    glGetRenderbufferImageANGLEContextANGLE =
+        reinterpret_cast<PFNGLGETRENDERBUFFERIMAGEANGLECONTEXTANGLEPROC>(
+            loadProc("glGetRenderbufferImageANGLEContextANGLE"));
+    glGetTexImageANGLEContextANGLE = reinterpret_cast<PFNGLGETTEXIMAGEANGLECONTEXTANGLEPROC>(
+        loadProc("glGetTexImageANGLEContextANGLE"));
     glDrawArraysInstancedANGLEContextANGLE =
         reinterpret_cast<PFNGLDRAWARRAYSINSTANCEDANGLECONTEXTANGLEPROC>(
             loadProc("glDrawArraysInstancedANGLEContextANGLE"));
@@ -3497,6 +3515,9 @@
     glProvokingVertexANGLEContextANGLE =
         reinterpret_cast<PFNGLPROVOKINGVERTEXANGLECONTEXTANGLEPROC>(
             loadProc("glProvokingVertexANGLEContextANGLE"));
+    glDisableExtensionANGLEContextANGLE =
+        reinterpret_cast<PFNGLDISABLEEXTENSIONANGLECONTEXTANGLEPROC>(
+            loadProc("glDisableExtensionANGLEContextANGLE"));
     glRequestExtensionANGLEContextANGLE =
         reinterpret_cast<PFNGLREQUESTEXTENSIONANGLECONTEXTANGLEPROC>(
             loadProc("glRequestExtensionANGLEContextANGLE"));
diff --git a/Source/ThirdParty/ANGLE/util/gles_loader_autogen.h b/Source/ThirdParty/ANGLE/util/gles_loader_autogen.h
index 2bcec27..68c69da 100644
--- a/Source/ThirdParty/ANGLE/util/gles_loader_autogen.h
+++ b/Source/ThirdParty/ANGLE/util/gles_loader_autogen.h
@@ -432,6 +432,8 @@
 ANGLE_UTIL_EXPORT extern PFNGLBLITFRAMEBUFFERANGLEPROC glBlitFramebufferANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC
     glRenderbufferStorageMultisampleANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGETRENDERBUFFERIMAGEANGLEPROC glGetRenderbufferImageANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGETTEXIMAGEANGLEPROC glGetTexImageANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLDRAWARRAYSINSTANCEDANGLEPROC glDrawArraysInstancedANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLDRAWELEMENTSINSTANCEDANGLEPROC glDrawElementsInstancedANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLVERTEXATTRIBDIVISORANGLEPROC glVertexAttribDivisorANGLE;
@@ -440,6 +442,7 @@
 ANGLE_UTIL_EXPORT extern PFNGLMULTIDRAWELEMENTSANGLEPROC glMultiDrawElementsANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLMULTIDRAWELEMENTSINSTANCEDANGLEPROC glMultiDrawElementsInstancedANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLPROVOKINGVERTEXANGLEPROC glProvokingVertexANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLDISABLEEXTENSIONANGLEPROC glDisableExtensionANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLREQUESTEXTENSIONANGLEPROC glRequestExtensionANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLEPROC glCompressedTexImage2DRobustANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLCOMPRESSEDTEXIMAGE3DROBUSTANGLEPROC glCompressedTexImage3DRobustANGLE;
@@ -1196,6 +1199,9 @@
     glBlitFramebufferANGLEContextANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLECONTEXTANGLEPROC
     glRenderbufferStorageMultisampleANGLEContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGETRENDERBUFFERIMAGEANGLECONTEXTANGLEPROC
+    glGetRenderbufferImageANGLEContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGETTEXIMAGEANGLECONTEXTANGLEPROC glGetTexImageANGLEContextANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLDRAWARRAYSINSTANCEDANGLECONTEXTANGLEPROC
     glDrawArraysInstancedANGLEContextANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLDRAWELEMENTSINSTANCEDANGLECONTEXTANGLEPROC
@@ -1212,6 +1218,8 @@
     glMultiDrawElementsInstancedANGLEContextANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLPROVOKINGVERTEXANGLECONTEXTANGLEPROC
     glProvokingVertexANGLEContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLDISABLEEXTENSIONANGLECONTEXTANGLEPROC
+    glDisableExtensionANGLEContextANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLREQUESTEXTENSIONANGLECONTEXTANGLEPROC
     glRequestExtensionANGLEContextANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLECONTEXTANGLEPROC
diff --git a/Source/ThirdParty/ANGLE/util/osx/OSXWindow.h b/Source/ThirdParty/ANGLE/util/osx/OSXWindow.h
index 0b2b18a..3ae2fd9 100644
--- a/Source/ThirdParty/ANGLE/util/osx/OSXWindow.h
+++ b/Source/ThirdParty/ANGLE/util/osx/OSXWindow.h
@@ -33,7 +33,7 @@
 {
   public:
     OSXWindow();
-    ~OSXWindow();
+    ~OSXWindow() override;
 
     bool initialize(const std::string &name, int width, int height) override;
     void destroy() override;
diff --git a/Source/ThirdParty/ANGLE/util/osx/OSXWindow.mm b/Source/ThirdParty/ANGLE/util/osx/OSXWindow.mm
index f7019ff..222032e 100644
--- a/Source/ThirdParty/ANGLE/util/osx/OSXWindow.mm
+++ b/Source/ThirdParty/ANGLE/util/osx/OSXWindow.mm
@@ -655,6 +655,11 @@
     }
     [mView setWantsLayer:YES];
 
+    // Disable scaling for this view. If scaling is enabled, the metal backend's
+    // frame buffer's size will be this window's size multiplied by contentScale.
+    // It will cause inconsistent testing & example apps' results.
+    mView.layer.contentsScale = 1;
+
     [mWindow setContentView:mView];
     [mWindow setTitle:[NSString stringWithUTF8String:name.c_str()]];
     [mWindow setAcceptsMouseMovedEvents:YES];
diff --git a/Source/ThirdParty/ANGLE/util/ozone/OzoneWindow.h b/Source/ThirdParty/ANGLE/util/ozone/OzoneWindow.h
index 085e784..8af91b4 100644
--- a/Source/ThirdParty/ANGLE/util/ozone/OzoneWindow.h
+++ b/Source/ThirdParty/ANGLE/util/ozone/OzoneWindow.h
@@ -17,7 +17,7 @@
 {
   public:
     OzoneWindow();
-    ~OzoneWindow();
+    ~OzoneWindow() override;
 
     bool initialize(const std::string &name, int width, int height) override;
     void destroy() override;
diff --git a/Source/ThirdParty/ANGLE/util/posix/crash_handler_posix.cpp b/Source/ThirdParty/ANGLE/util/posix/crash_handler_posix.cpp
index e40c4b5..64c31a7 100644
--- a/Source/ThirdParty/ANGLE/util/posix/crash_handler_posix.cpp
+++ b/Source/ThirdParty/ANGLE/util/posix/crash_handler_posix.cpp
@@ -43,7 +43,7 @@
     // No implementations yet.
 }
 
-void InitCrashHandler()
+void InitCrashHandler(CrashCallback *callback)
 {
     // No implementations yet.
 }
@@ -140,7 +140,7 @@
     SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGSEGV, SIGTRAP,
 };
 
-void InitCrashHandler()
+void InitCrashHandler(CrashCallback *callback)
 {
     for (int sig : kSignals)
     {
diff --git a/Source/ThirdParty/ANGLE/util/posix/test_utils_posix.cpp b/Source/ThirdParty/ANGLE/util/posix/test_utils_posix.cpp
index 9d6c82f..b1ec61c 100644
--- a/Source/ThirdParty/ANGLE/util/posix/test_utils_posix.cpp
+++ b/Source/ThirdParty/ANGLE/util/posix/test_utils_posix.cpp
@@ -8,24 +8,299 @@
 
 #include "util/test_utils.h"
 
+#include <dlfcn.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <sched.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
 #include <time.h>
 #include <unistd.h>
 #include <cstdarg>
+#include <cstring>
+#include <iostream>
 
+#include "common/debug.h"
 #include "common/platform.h"
 
 #if !defined(ANGLE_PLATFORM_FUCHSIA)
-#    include <dlfcn.h>
 #    include <sys/resource.h>
-#    include <sys/stat.h>
-#    include <sys/types.h>
-#    include <sys/wait.h>
 #endif
 
 namespace angle
 {
+namespace
+{
+struct ScopedPipe
+{
+    ~ScopedPipe()
+    {
+        closeEndPoint(0);
+        closeEndPoint(1);
+    }
+
+    void closeEndPoint(int index)
+    {
+        if (fds[index] >= 0)
+        {
+            close(fds[index]);
+            fds[index] = -1;
+        }
+    }
+
+    bool valid() const { return fds[0] != -1 || fds[1] != -1; }
+
+    int fds[2] = {
+        -1,
+        -1,
+    };
+};
+
+bool ReadFromFile(int fd, std::string *out)
+{
+    char buffer[256];
+    ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
+
+    // If interrupted, retry.
+    if (bytesRead < 0 && errno == EINTR)
+    {
+        return true;
+    }
+
+    // If failed, or nothing to read, we are done.
+    if (bytesRead <= 0)
+    {
+        return false;
+    }
+
+    out->append(buffer, bytesRead);
+    return true;
+}
+
+void ReadEntireFile(int fd, std::string *out)
+{
+    while (true)
+    {
+        if (!ReadFromFile(fd, out))
+            break;
+    }
+}
+
+class PosixProcess : public Process
+{
+  public:
+    PosixProcess(const std::vector<const char *> &commandLineArgs,
+                 bool captureStdOut,
+                 bool captureStdErr)
+    {
+        if (commandLineArgs.empty())
+        {
+            return;
+        }
+
+        // Create pipes for stdout and stderr.
+        if (captureStdOut)
+        {
+            if (pipe(mStdoutPipe.fds) != 0)
+            {
+                std::cerr << "Error calling pipe: " << errno << "\n";
+                return;
+            }
+            if (fcntl(mStdoutPipe.fds[0], F_SETFL, O_NONBLOCK) == -1)
+            {
+                std::cerr << "Error calling fcntl: " << errno << "\n";
+                return;
+            }
+        }
+        if (captureStdErr)
+        {
+            if (pipe(mStderrPipe.fds) != 0)
+            {
+                std::cerr << "Error calling pipe: " << errno << "\n";
+                return;
+            }
+            if (fcntl(mStderrPipe.fds[0], F_SETFL, O_NONBLOCK) == -1)
+            {
+                std::cerr << "Error calling fcntl: " << errno << "\n";
+                return;
+            }
+        }
+
+        mPID = fork();
+        if (mPID < 0)
+        {
+            return;
+        }
+
+        mStarted = true;
+        mTimer.start();
+
+        if (mPID == 0)
+        {
+            // Child.  Execute the application.
+
+            // Redirect stdout and stderr to the pipe fds.
+            if (captureStdOut)
+            {
+                if (dup2(mStdoutPipe.fds[1], STDOUT_FILENO) < 0)
+                {
+                    _exit(errno);
+                }
+                mStdoutPipe.closeEndPoint(1);
+            }
+            if (captureStdErr)
+            {
+                if (dup2(mStderrPipe.fds[1], STDERR_FILENO) < 0)
+                {
+                    _exit(errno);
+                }
+                mStderrPipe.closeEndPoint(1);
+            }
+
+            // Execute the application, which doesn't return unless failed.  Note: execv takes argv
+            // as `char * const *` for historical reasons.  It is safe to const_cast it:
+            //
+            // http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html
+            //
+            // > The statement about argv[] and envp[] being constants is included to make explicit
+            // to future writers of language bindings that these objects are completely constant.
+            // Due to a limitation of the ISO C standard, it is not possible to state that idea in
+            // standard C. Specifying two levels of const- qualification for the argv[] and envp[]
+            // parameters for the exec functions may seem to be the natural choice, given that these
+            // functions do not modify either the array of pointers or the characters to which the
+            // function points, but this would disallow existing correct code. Instead, only the
+            // array of pointers is noted as constant.
+            std::vector<char *> args;
+            for (const char *arg : commandLineArgs)
+            {
+                args.push_back(const_cast<char *>(arg));
+            }
+            args.push_back(nullptr);
+
+            execv(commandLineArgs[0], args.data());
+            std::cerr << "Error calling evecv: " << errno;
+            _exit(errno);
+        }
+        // Parent continues execution.
+        mStdoutPipe.closeEndPoint(1);
+        mStderrPipe.closeEndPoint(1);
+    }
+
+    ~PosixProcess() override {}
+
+    bool started() override { return mStarted; }
+
+    bool finish() override
+    {
+        if (!mStarted)
+        {
+            return false;
+        }
+
+        if (mFinished)
+        {
+            return true;
+        }
+
+        while (!finished())
+        {
+            angle::Sleep(1);
+        }
+
+        return true;
+    }
+
+    bool finished() override
+    {
+        if (!mStarted)
+        {
+            return false;
+        }
+
+        if (mFinished)
+        {
+            return true;
+        }
+
+        int status        = 0;
+        pid_t returnedPID = ::waitpid(mPID, &status, WNOHANG);
+
+        if (returnedPID == -1 && errno != ECHILD)
+        {
+            std::cerr << "Error calling waitpid: " << ::strerror(errno) << "\n";
+            return true;
+        }
+
+        if (returnedPID == mPID)
+        {
+            mFinished = true;
+            mTimer.stop();
+            readPipes();
+            mExitCode = WEXITSTATUS(status);
+            return true;
+        }
+
+        if (mStdoutPipe.valid())
+        {
+            ReadFromFile(mStdoutPipe.fds[0], &mStdout);
+        }
+
+        if (mStderrPipe.valid())
+        {
+            ReadFromFile(mStderrPipe.fds[0], &mStderr);
+        }
+
+        return false;
+    }
+
+    int getExitCode() override { return mExitCode; }
+
+    bool kill() override
+    {
+        if (!mStarted)
+        {
+            return false;
+        }
+
+        if (finished())
+        {
+            return true;
+        }
+
+        return (::kill(mPID, SIGTERM) == 0);
+    }
+
+  private:
+    void readPipes()
+    {
+        // Close the write end of the pipes, so EOF can be generated when child exits.
+        // Then read back the output of the child.
+        if (mStdoutPipe.valid())
+        {
+            ReadEntireFile(mStdoutPipe.fds[0], &mStdout);
+        }
+        if (mStderrPipe.valid())
+        {
+            ReadEntireFile(mStderrPipe.fds[0], &mStderr);
+        }
+    }
+
+    bool mStarted  = false;
+    bool mFinished = false;
+    ScopedPipe mStdoutPipe;
+    ScopedPipe mStderrPipe;
+    int mExitCode = 0;
+    pid_t mPID    = -1;
+};
+
+std::string TempFileName()
+{
+    return std::string(".angle.XXXXXX");
+}
+}  // anonymous namespace
+
 void Sleep(unsigned int milliseconds)
 {
     // On Windows Sleep(0) yields while it isn't guaranteed by Posix's sleep
@@ -94,4 +369,68 @@
     return false;
 #endif
 }
+
+bool GetTempDir(char *tempDirOut, uint32_t maxDirNameLen)
+{
+    const char *tmp = getenv("TMPDIR");
+    if (tmp)
+    {
+        strncpy(tempDirOut, tmp, maxDirNameLen);
+        return true;
+    }
+
+#if defined(ANGLE_PLATFORM_ANDROID)
+    // TODO(jmadill): Android support. http://anglebug.com/3162
+    // return PathService::Get(DIR_CACHE, path);
+    return false;
+#else
+    strncpy(tempDirOut, "/tmp", maxDirNameLen);
+    return true;
+#endif
+}
+
+bool CreateTemporaryFileInDir(const char *dir, char *tempFileNameOut, uint32_t maxFileNameLen)
+{
+    std::string tempFile = TempFileName();
+    sprintf(tempFileNameOut, "%s/%s", dir, tempFile.c_str());
+    int fd = mkstemp(tempFileNameOut);
+    close(fd);
+    return fd != -1;
+}
+
+bool DeleteFile(const char *path)
+{
+    return unlink(path) == 0;
+}
+
+Process *LaunchProcess(const std::vector<const char *> &args,
+                       bool captureStdout,
+                       bool captureStderr)
+{
+    return new PosixProcess(args, captureStdout, captureStderr);
+}
+
+int NumberOfProcessors()
+{
+    // sysconf returns the number of "logical" (not "physical") processors on both
+    // Mac and Linux.  So we get the number of max available "logical" processors.
+    //
+    // Note that the number of "currently online" processors may be fewer than the
+    // returned value of NumberOfProcessors(). On some platforms, the kernel may
+    // make some processors offline intermittently, to save power when system
+    // loading is low.
+    //
+    // One common use case that needs to know the processor count is to create
+    // optimal number of threads for optimization. It should make plan according
+    // to the number of "max available" processors instead of "currently online"
+    // ones. The kernel should be smart enough to make all processors online when
+    // it has sufficient number of threads waiting to run.
+    long res = sysconf(_SC_NPROCESSORS_CONF);
+    if (res == -1)
+    {
+        return 1;
+    }
+
+    return static_cast<int>(res);
+}
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/util/shader_utils.cpp b/Source/ThirdParty/ANGLE/util/shader_utils.cpp
index 518608e..50afabf 100644
--- a/Source/ThirdParty/ANGLE/util/shader_utils.cpp
+++ b/Source/ThirdParty/ANGLE/util/shader_utils.cpp
@@ -4,33 +4,26 @@
 // found in the LICENSE file.
 //
 
-#include "shader_utils.h"
+#include "util/shader_utils.h"
 
 #include <cstring>
 #include <fstream>
 #include <iostream>
 #include <vector>
 
+#include "util/test_utils.h"
+
 namespace
 {
-std::string ReadFileToString(const std::string &source)
+bool ReadEntireFile(const std::string &filePath, std::string *contentsOut)
 {
-    std::ifstream stream(source.c_str());
-    if (!stream)
-    {
-        std::cerr << "Failed to load shader file: " << source;
-        return "";
-    }
-
-    std::string result;
-
-    stream.seekg(0, std::ios::end);
-    result.reserve(static_cast<unsigned int>(stream.tellg()));
-    stream.seekg(0, std::ios::beg);
-
-    result.assign((std::istreambuf_iterator<char>(stream)), std::istreambuf_iterator<char>());
-
-    return result;
+    constexpr uint32_t kMaxBufferSize = 2000;
+    char buffer[kMaxBufferSize]       = {};
+    if (!angle::ReadEntireFileToString(filePath.c_str(), buffer, kMaxBufferSize) ||
+        strlen(buffer) == 0)
+        return false;
+    *contentsOut = buffer;
+    return true;
 }
 
 GLuint CompileProgramInternal(const char *vsSource,
@@ -124,9 +117,10 @@
 
 GLuint CompileShaderFromFile(GLenum type, const std::string &sourcePath)
 {
-    std::string source = ReadFileToString(sourcePath);
-    if (source.empty())
+    std::string source;
+    if (!ReadEntireFile(sourcePath, &source))
     {
+        std::cerr << "Error reading shader file: " << sourcePath << "\n";
         return 0;
     }
 
@@ -214,10 +208,17 @@
 
 GLuint CompileProgramFromFiles(const std::string &vsPath, const std::string &fsPath)
 {
-    std::string vsSource = ReadFileToString(vsPath);
-    std::string fsSource = ReadFileToString(fsPath);
-    if (vsSource.empty() || fsSource.empty())
+    std::string vsSource;
+    if (!ReadEntireFile(vsPath, &vsSource))
     {
+        std::cerr << "Error reading shader: " << vsPath << "\n";
+        return 0;
+    }
+
+    std::string fsSource;
+    if (!ReadEntireFile(fsPath, &fsSource))
+    {
+        std::cerr << "Error reading shader: " << fsPath << "\n";
         return 0;
     }
 
@@ -408,12 +409,12 @@
 const char *Texture2D()
 {
     return R"(precision mediump float;
-uniform sampler2D u_tex;
+uniform sampler2D u_tex2D;
 varying vec2 v_texCoord;
 
 void main()
 {
-    gl_FragColor = texture2D(u_tex, v_texCoord);
+    gl_FragColor = texture2D(u_tex2D, v_texCoord);
 })";
 }
 
diff --git a/Source/ThirdParty/ANGLE/util/test_utils.cpp b/Source/ThirdParty/ANGLE/util/test_utils.cpp
new file mode 100644
index 0000000..ac4dc8f
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/util/test_utils.cpp
@@ -0,0 +1,97 @@
+//
+// 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.
+//
+
+// system_utils: Defines common utility functions
+
+#include "util/test_utils.h"
+
+#include <cstring>
+#include <fstream>
+
+namespace angle
+{
+bool CreateTemporaryFile(char *tempFileNameOut, uint32_t maxFileNameLen)
+{
+    constexpr uint32_t kMaxPath = 1000u;
+    char tempPath[kMaxPath];
+
+    if (!GetTempDir(tempPath, kMaxPath))
+        return false;
+
+    return CreateTemporaryFileInDir(tempPath, tempFileNameOut, maxFileNameLen);
+}
+
+bool GetFileSize(const char *filePath, uint32_t *sizeOut)
+{
+    std::ifstream stream(filePath);
+    if (!stream)
+    {
+        return false;
+    }
+
+    stream.seekg(0, std::ios::end);
+    *sizeOut = static_cast<uint32_t>(stream.tellg());
+    return true;
+}
+
+bool ReadEntireFileToString(const char *filePath, char *contentsOut, uint32_t maxLen)
+{
+    std::ifstream stream(filePath);
+    if (!stream)
+    {
+        return false;
+    }
+
+    std::string contents;
+
+    stream.seekg(0, std::ios::end);
+    contents.reserve(static_cast<unsigned int>(stream.tellg()));
+    stream.seekg(0, std::ios::beg);
+
+    contents.assign((std::istreambuf_iterator<char>(stream)), std::istreambuf_iterator<char>());
+
+    strncpy(contentsOut, contents.c_str(), maxLen);
+    return true;
+}
+
+// static
+Process::~Process() = default;
+
+ProcessHandle::ProcessHandle() : mProcess(nullptr) {}
+
+ProcessHandle::ProcessHandle(Process *process) : mProcess(process) {}
+
+ProcessHandle::ProcessHandle(const std::vector<const char *> &args,
+                             bool captureStdout,
+                             bool captureStderr)
+    : mProcess(LaunchProcess(args, captureStdout, captureStderr))
+{}
+
+ProcessHandle::~ProcessHandle()
+{
+    reset();
+}
+
+ProcessHandle::ProcessHandle(ProcessHandle &&other) : mProcess(other.mProcess)
+{
+    other.mProcess = nullptr;
+}
+
+ProcessHandle &ProcessHandle::operator=(ProcessHandle &&rhs)
+{
+    std::swap(mProcess, rhs.mProcess);
+    return *this;
+}
+
+void ProcessHandle::reset()
+{
+    if (mProcess)
+    {
+        delete mProcess;
+        mProcess = nullptr;
+    }
+}
+}  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/util/test_utils.h b/Source/ThirdParty/ANGLE/util/test_utils.h
index 6a4951d..7a3b217 100644
--- a/Source/ThirdParty/ANGLE/util/test_utils.h
+++ b/Source/ThirdParty/ANGLE/util/test_utils.h
@@ -9,9 +9,12 @@
 #ifndef UTIL_TEST_UTILS_H_
 #define UTIL_TEST_UTILS_H_
 
+#include <functional>
 #include <string>
 #include <vector>
 
+#include "common/angleutils.h"
+#include "util/Timer.h"
 #include "util/util_export.h"
 
 namespace angle
@@ -28,12 +31,96 @@
 ANGLE_UTIL_EXPORT bool StabilizeCPUForBenchmarking();
 
 // Set a crash handler to print stack traces.
-ANGLE_UTIL_EXPORT void InitCrashHandler();
+using CrashCallback = std::function<void()>;
+ANGLE_UTIL_EXPORT void InitCrashHandler(CrashCallback *callback);
 ANGLE_UTIL_EXPORT void TerminateCrashHandler();
 
 // Print a stack back trace.
 ANGLE_UTIL_EXPORT void PrintStackBacktrace();
 
+// Get temporary directory.
+ANGLE_UTIL_EXPORT bool GetTempDir(char *tempDirOut, uint32_t maxDirNameLen);
+
+// Creates a temporary file. The full path is placed in |path|, and the
+// function returns true if was successful in creating the file. The file will
+// be empty and all handles closed after this function returns.
+ANGLE_UTIL_EXPORT bool CreateTemporaryFile(char *tempFileNameOut, uint32_t maxFileNameLen);
+
+// Same as CreateTemporaryFile but the file is created in |dir|.
+ANGLE_UTIL_EXPORT bool CreateTemporaryFileInDir(const char *dir,
+                                                char *tempFileNameOut,
+                                                uint32_t maxFileNameLen);
+
+// Deletes a file or directory.
+ANGLE_UTIL_EXPORT bool DeleteFile(const char *path);
+
+// Reads a file contents into a string.
+ANGLE_UTIL_EXPORT bool ReadEntireFileToString(const char *filePath,
+                                              char *contentsOut,
+                                              uint32_t maxLen);
+
+// Compute a file's size.
+ANGLE_UTIL_EXPORT bool GetFileSize(const char *filePath, uint32_t *sizeOut);
+
+class ANGLE_UTIL_EXPORT ProcessHandle;
+
+class ANGLE_UTIL_EXPORT Process : angle::NonCopyable
+{
+  public:
+    virtual bool started()    = 0;
+    virtual bool finished()   = 0;
+    virtual bool finish()     = 0;
+    virtual bool kill()       = 0;
+    virtual int getExitCode() = 0;
+
+    double getElapsedTimeSeconds() const { return mTimer.getElapsedTime(); }
+    const std::string &getStdout() const { return mStdout; }
+    const std::string &getStderr() const { return mStderr; }
+
+  protected:
+    friend class ANGLE_UTIL_EXPORT ProcessHandle;
+    virtual ~Process();
+
+    Timer mTimer;
+    std::string mStdout;
+    std::string mStderr;
+};
+
+class ANGLE_UTIL_EXPORT ProcessHandle final : angle::NonCopyable
+{
+  public:
+    ProcessHandle();
+    ProcessHandle(Process *process);
+    ProcessHandle(const std::vector<const char *> &args, bool captureStdout, bool captureStderr);
+    ~ProcessHandle();
+    ProcessHandle(ProcessHandle &&other);
+    ProcessHandle &operator=(ProcessHandle &&rhs);
+
+    Process *operator->() { return mProcess; }
+    const Process *operator->() const { return mProcess; }
+
+    operator bool() const { return mProcess != nullptr; }
+
+    void reset();
+
+  private:
+    Process *mProcess;
+};
+
+// Launch a process and optionally get the output. Uses a vector of c strings as command line
+// arguments to the child process. Returns a Process handle which can be used to retrieve
+// the stdout and stderr outputs as well as the exit code.
+//
+// Pass false for stdoutOut/stderrOut if you don't need to capture them.
+//
+// On success, returns a Process pointer with started() == true.
+// On failure, returns a Process pointer with started() == false.
+ANGLE_UTIL_EXPORT Process *LaunchProcess(const std::vector<const char *> &args,
+                                         bool captureStdout,
+                                         bool captureStderr);
+
+ANGLE_UTIL_EXPORT int NumberOfProcessors();
+
 }  // namespace angle
 
 #endif  // UTIL_TEST_UTILS_H_
diff --git a/Source/ThirdParty/ANGLE/util/test_utils_unittest.cpp b/Source/ThirdParty/ANGLE/util/test_utils_unittest.cpp
new file mode 100644
index 0000000..9b02a5a
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/util/test_utils_unittest.cpp
@@ -0,0 +1,223 @@
+//
+// 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.
+
+// test_utils_unittest.cpp: Unit tests for ANGLE's test utility functions
+
+#include "gtest/gtest.h"
+
+#include "common/system_utils.h"
+#include "util/Timer.h"
+#include "util/test_utils.h"
+#include "util/test_utils_unittest_helper.h"
+
+using namespace angle;
+
+namespace
+{
+#if defined(ANGLE_PLATFORM_WINDOWS)
+constexpr char kRunAppHelperExecutable[] = "test_utils_unittest_helper.exe";
+#else
+constexpr char kRunAppHelperExecutable[] = "test_utils_unittest_helper";
+#endif
+
+// Transforms various line endings into C/Unix line endings:
+//
+// - A\nB -> A\nB
+// - A\rB -> A\nB
+// - A\r\nB -> A\nB
+std::string NormalizeNewLines(const std::string &str)
+{
+    std::string result;
+
+    for (size_t i = 0; i < str.size(); ++i)
+    {
+        if (str[i] == '\r')
+        {
+            if (i + 1 < str.size() && str[i + 1] == '\n')
+            {
+                ++i;
+            }
+            result += '\n';
+        }
+        else
+        {
+            result += str[i];
+        }
+    }
+
+    return result;
+}
+
+// Tests that Sleep() actually waits some time.
+TEST(TestUtils, Sleep)
+{
+    Timer timer;
+    timer.start();
+    angle::Sleep(500);
+    timer.stop();
+
+    // Use a slightly fuzzy range
+    EXPECT_GT(timer.getElapsedTime(), 0.48);
+}
+
+constexpr uint32_t kMaxPath = 1000;
+
+// Temporary file creation is not supported on Android right now.
+#if defined(ANGLE_PLATFORM_ANDROID)
+#    define MAYBE_CreateAndDeleteTemporaryFile DISABLED_CreateAndDeleteTemporaryFile
+#    define MAYBE_CreateAndDeleteFileInTempDir DISABLED_CreateAndDeleteFileInTempDir
+#else
+#    define MAYBE_CreateAndDeleteTemporaryFile CreateAndDeleteTemporaryFile
+#    define MAYBE_CreateAndDeleteFileInTempDir CreateAndDeleteFileInTempDir
+#endif  // defined(ANGLE_PLATFORM_ANDROID)
+
+// Test creating and deleting temporary file.
+TEST(TestUtils, MAYBE_CreateAndDeleteTemporaryFile)
+{
+    char path[kMaxPath] = {};
+    ASSERT_TRUE(CreateTemporaryFile(path, kMaxPath));
+    ASSERT_TRUE(strlen(path) > 0);
+
+    const char kOutputString[] = "test output";
+
+    FILE *fp = fopen(path, "wt");
+    ASSERT_NE(fp, nullptr);
+    int retval = fputs(kOutputString, fp);
+    fclose(fp);
+
+    EXPECT_GE(retval, 0);
+
+    // Test ReadEntireFileToString
+    char actualString[kMaxPath];
+    EXPECT_TRUE(ReadEntireFileToString(path, actualString, kMaxPath));
+    EXPECT_EQ(strcmp(actualString, kOutputString), 0);
+
+    // Delete the temporary file.
+    EXPECT_TRUE(angle::DeleteFile(path));
+}
+
+// Tests creating and deleting a file in the system temp dir.
+TEST(TestUtils, MAYBE_CreateAndDeleteFileInTempDir)
+{
+    char tempDir[kMaxPath];
+    ASSERT_TRUE(GetTempDir(tempDir, kMaxPath));
+
+    char path[kMaxPath] = {};
+    ASSERT_TRUE(CreateTemporaryFileInDir(tempDir, path, kMaxPath));
+    ASSERT_TRUE(strlen(path) > 0);
+
+    const char kOutputString[] = "test output";
+
+    FILE *fp = fopen(path, "wt");
+    ASSERT_NE(fp, nullptr);
+    int retval = fputs(kOutputString, fp);
+    fclose(fp);
+
+    EXPECT_GE(retval, 0);
+
+    // Test ReadEntireFileToString
+    char actualString[kMaxPath];
+    EXPECT_TRUE(ReadEntireFileToString(path, actualString, kMaxPath));
+    EXPECT_EQ(strcmp(actualString, kOutputString), 0);
+
+    // Delete the temporary file.
+    EXPECT_TRUE(angle::DeleteFile(path));
+}
+
+// TODO: android support. http://anglebug.com/3125
+#if defined(ANGLE_PLATFORM_ANDROID)
+#    define MAYBE_RunApp DISABLED_RunApp
+#    define MAYBE_RunAppAsync DISABLED_RunAppAsync
+// TODO: fuchsia support. http://anglebug.com/3161
+#elif defined(ANGLE_PLATFORM_FUCHSIA)
+#    define MAYBE_RunApp DISABLED_RunApp
+#    define MAYBE_RunAppAsync DISABLED_RunAppAsync
+#else
+#    define MAYBE_RunApp RunApp
+#    define MAYBE_RunAppAsync RunAppAsync
+#endif  // defined(ANGLE_PLATFORM_ANDROID)
+
+// Test running an external application and receiving its output
+TEST(TestUtils, MAYBE_RunApp)
+{
+    std::string executablePath = GetExecutableDirectory();
+    EXPECT_NE(executablePath, "");
+    executablePath += "/";
+    executablePath += kRunAppHelperExecutable;
+
+    std::vector<const char *> args = {executablePath.c_str(), kRunAppTestArg1, kRunAppTestArg2};
+
+    // Test that the application can be executed.
+    {
+        ProcessHandle process(args, true, true);
+        EXPECT_TRUE(process->started());
+        EXPECT_TRUE(process->finish());
+        EXPECT_TRUE(process->finished());
+
+        EXPECT_GT(process->getElapsedTimeSeconds(), 0.0);
+        EXPECT_EQ(kRunAppTestStdout, NormalizeNewLines(process->getStdout()));
+        EXPECT_EQ(kRunAppTestStderr, NormalizeNewLines(process->getStderr()));
+        EXPECT_EQ(EXIT_SUCCESS, process->getExitCode());
+    }
+
+    // Test that environment variables reach the child.
+    {
+        bool setEnvDone = SetEnvironmentVar(kRunAppTestEnvVarName, kRunAppTestEnvVarValue);
+        EXPECT_TRUE(setEnvDone);
+
+        ProcessHandle process(LaunchProcess(args, true, true));
+        EXPECT_TRUE(process->started());
+        EXPECT_TRUE(process->finish());
+
+        EXPECT_GT(process->getElapsedTimeSeconds(), 0.0);
+        EXPECT_EQ("", process->getStdout());
+        EXPECT_EQ(kRunAppTestEnvVarValue, NormalizeNewLines(process->getStderr()));
+        EXPECT_EQ(EXIT_SUCCESS, process->getExitCode());
+
+        // Unset environment var.
+        SetEnvironmentVar(kRunAppTestEnvVarName, "");
+    }
+}
+
+// Test running an external application and receiving its output asynchronously.
+TEST(TestUtils, MAYBE_RunAppAsync)
+{
+    std::string executablePath = GetExecutableDirectory();
+    EXPECT_NE(executablePath, "");
+    executablePath += "/";
+    executablePath += kRunAppHelperExecutable;
+
+    std::vector<const char *> args = {executablePath.c_str(), kRunAppTestArg1, kRunAppTestArg2};
+
+    // Test that the application can be executed.
+    {
+        ProcessHandle process(args, true, true);
+        EXPECT_TRUE(process->started());
+
+        constexpr double kTimeout = 3.0;
+
+        Timer timer;
+        timer.start();
+        while (!process->finished() && timer.getElapsedTime() < kTimeout)
+        {
+            angle::Sleep(1);
+        }
+
+        EXPECT_TRUE(process->finished());
+        EXPECT_GT(process->getElapsedTimeSeconds(), 0.0);
+        EXPECT_EQ(kRunAppTestStdout, NormalizeNewLines(process->getStdout()));
+        EXPECT_EQ(kRunAppTestStderr, NormalizeNewLines(process->getStderr()));
+        EXPECT_EQ(EXIT_SUCCESS, process->getExitCode());
+    }
+}
+
+// Verify that NumberOfProcessors returns something sane.
+TEST(TestUtils, NumberOfProcessors)
+{
+    int numProcs = angle::NumberOfProcessors();
+    EXPECT_GT(numProcs, 0);
+    EXPECT_LT(numProcs, 1000);
+}
+}  // namespace
diff --git a/Source/ThirdParty/ANGLE/util/test_utils_unittest_helper.cpp b/Source/ThirdParty/ANGLE/util/test_utils_unittest_helper.cpp
new file mode 100644
index 0000000..2604f11
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/util/test_utils_unittest_helper.cpp
@@ -0,0 +1,35 @@
+//
+// 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.
+
+// system_utils_unittest_helper.cpp: Helper to the SystemUtils.RunApp unittest
+
+#include "test_utils_unittest_helper.h"
+
+#include "common/system_utils.h"
+
+#include <string.h>
+
+int main(int argc, char **argv)
+{
+    if (argc != 3 || strcmp(argv[1], kRunAppTestArg1) != 0 || strcmp(argv[2], kRunAppTestArg2) != 0)
+    {
+        fprintf(stderr, "Expected command line:\n%s %s %s\n", argv[0], kRunAppTestArg1,
+                kRunAppTestArg2);
+        return EXIT_FAILURE;
+    }
+
+    std::string env = angle::GetEnvironmentVar(kRunAppTestEnvVarName);
+    if (env == "")
+    {
+        printf("%s", kRunAppTestStdout);
+        fprintf(stderr, "%s", kRunAppTestStderr);
+    }
+    else
+    {
+        fprintf(stderr, "%s", env.c_str());
+    }
+
+    return EXIT_SUCCESS;
+}
diff --git a/Source/ThirdParty/ANGLE/util/test_utils_unittest_helper.h b/Source/ThirdParty/ANGLE/util/test_utils_unittest_helper.h
new file mode 100644
index 0000000..660bde1
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/util/test_utils_unittest_helper.h
@@ -0,0 +1,21 @@
+//
+// 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.
+
+// system_utils_unittest_helper.h: Constants used by the SystemUtils.RunApp unittest
+
+#ifndef COMMON_SYSTEM_UTILS_UNITTEST_HELPER_H_
+#define COMMON_SYSTEM_UTILS_UNITTEST_HELPER_H_
+
+namespace
+{
+constexpr char kRunAppTestEnvVarName[]  = "RUN_APP_TEST_ENV";
+constexpr char kRunAppTestEnvVarValue[] = "RunAppTest environment variable value\n";
+constexpr char kRunAppTestStdout[]      = "RunAppTest stdout test\n";
+constexpr char kRunAppTestStderr[] = "RunAppTest stderr test\n  .. that expands multiple lines\n";
+constexpr char kRunAppTestArg1[]   = "--expected-arg1";
+constexpr char kRunAppTestArg2[]   = "expected_arg2";
+}  // anonymous namespace
+
+#endif  // COMMON_SYSTEM_UTILS_UNITTEST_HELPER_H_
diff --git a/Source/ThirdParty/ANGLE/util/util.gni b/Source/ThirdParty/ANGLE/util/util.gni
index 4304cae..fa1b3361 100644
--- a/Source/ThirdParty/ANGLE/util/util.gni
+++ b/Source/ThirdParty/ANGLE/util/util.gni
@@ -12,6 +12,7 @@
   "util/random_utils.h",
   "util/shader_utils.cpp",
   "util/shader_utils.h",
+  "util/test_utils.cpp",
   "util/test_utils.h",
   "util/util_export.h",
   "util/util_gl.h",
diff --git a/Source/ThirdParty/ANGLE/util/windows/WGLWindow.cpp b/Source/ThirdParty/ANGLE/util/windows/WGLWindow.cpp
index 96c4d42..a9e82e1 100644
--- a/Source/ThirdParty/ANGLE/util/windows/WGLWindow.cpp
+++ b/Source/ThirdParty/ANGLE/util/windows/WGLWindow.cpp
@@ -19,7 +19,7 @@
 {
 PIXELFORMATDESCRIPTOR GetDefaultPixelFormatDescriptor()
 {
-    PIXELFORMATDESCRIPTOR pixelFormatDescriptor = {0};
+    PIXELFORMATDESCRIPTOR pixelFormatDescriptor = {};
     pixelFormatDescriptor.nSize                 = sizeof(pixelFormatDescriptor);
     pixelFormatDescriptor.nVersion              = 1;
     pixelFormatDescriptor.dwFlags =
diff --git a/Source/ThirdParty/ANGLE/util/windows/test_utils_win.cpp b/Source/ThirdParty/ANGLE/util/windows/test_utils_win.cpp
index 05a44c8..2a303a7 100644
--- a/Source/ThirdParty/ANGLE/util/windows/test_utils_win.cpp
+++ b/Source/ThirdParty/ANGLE/util/windows/test_utils_win.cpp
@@ -8,10 +8,15 @@
 
 #include "util/test_utils.h"
 
+#include <aclapi.h>
 #include <stdarg.h>
+#include <versionhelpers.h>
 #include <windows.h>
 #include <array>
+#include <iostream>
+#include <vector>
 
+#include "anglebase/no_destructor.h"
 #include "common/angleutils.h"
 #include "util/windows/third_party/StackWalker/src/StackWalker.h"
 
@@ -39,7 +44,7 @@
 {
   public:
     CustomStackWalker() {}
-    ~CustomStackWalker() {}
+    ~CustomStackWalker() override {}
 
     void OnCallstackEntry(CallstackEntryType eType, CallstackEntry &entry) override
     {
@@ -105,6 +110,354 @@
     // The compiler wants us to return something.  This is what we'd do if we didn't _exit().
     return EXCEPTION_EXECUTE_HANDLER;
 }
+
+CrashCallback *gCrashHandlerCallback;
+
+LONG WINAPI CrashHandler(EXCEPTION_POINTERS *e)
+{
+    if (gCrashHandlerCallback)
+    {
+        (*gCrashHandlerCallback)();
+    }
+    return StackTraceCrashHandler(e);
+}
+
+struct ScopedPipe
+{
+    ~ScopedPipe()
+    {
+        closeReadHandle();
+        closeWriteHandle();
+    }
+    bool closeReadHandle()
+    {
+        if (readHandle)
+        {
+            if (::CloseHandle(readHandle) == FALSE)
+            {
+                std::cerr << "Error closing write handle: " << GetLastError();
+                return false;
+            }
+            readHandle = nullptr;
+        }
+
+        return true;
+    }
+    bool closeWriteHandle()
+    {
+        if (writeHandle)
+        {
+            if (::CloseHandle(writeHandle) == FALSE)
+            {
+                std::cerr << "Error closing write handle: " << GetLastError();
+                return false;
+            }
+            writeHandle = nullptr;
+        }
+
+        return true;
+    }
+
+    bool valid() const { return readHandle != nullptr || writeHandle != nullptr; }
+
+    bool initPipe(SECURITY_ATTRIBUTES *securityAttribs)
+    {
+        if (::CreatePipe(&readHandle, &writeHandle, securityAttribs, 0) == FALSE)
+        {
+            std::cerr << "Error creating pipe: " << GetLastError() << "\n";
+            return false;
+        }
+
+        // Ensure the read handles to the pipes are not inherited.
+        if (::SetHandleInformation(readHandle, HANDLE_FLAG_INHERIT, 0) == FALSE)
+        {
+            std::cerr << "Error setting handle info on pipe: " << GetLastError() << "\n";
+            return false;
+        }
+
+        return true;
+    }
+
+    HANDLE readHandle  = nullptr;
+    HANDLE writeHandle = nullptr;
+};
+
+// Returns false on EOF or error.
+void ReadFromFile(bool blocking, HANDLE handle, std::string *out)
+{
+    char buffer[8192];
+    DWORD bytesRead = 0;
+
+    while (true)
+    {
+        if (!blocking)
+        {
+            BOOL success = ::PeekNamedPipe(handle, nullptr, 0, nullptr, &bytesRead, nullptr);
+            if (success == FALSE || bytesRead == 0)
+                return;
+        }
+
+        BOOL success = ::ReadFile(handle, buffer, sizeof(buffer), &bytesRead, nullptr);
+        if (success == FALSE || bytesRead == 0)
+            return;
+
+        out->append(buffer, bytesRead);
+    }
+
+    // unreachable.
+}
+
+// Returns the Win32 last error code or ERROR_SUCCESS if the last error code is
+// ERROR_FILE_NOT_FOUND or ERROR_PATH_NOT_FOUND. This is useful in cases where
+// the absence of a file or path is a success condition (e.g., when attempting
+// to delete an item in the filesystem).
+bool ReturnSuccessOnNotFound()
+{
+    const DWORD error_code = ::GetLastError();
+    return (error_code == ERROR_FILE_NOT_FOUND || error_code == ERROR_PATH_NOT_FOUND);
+}
+
+// Job objects seems to have problems on the Chromium CI and Windows 7.
+bool ShouldUseJobObjects()
+{
+    return (::IsWindows10OrGreater());
+}
+
+class WindowsProcess : public Process
+{
+  public:
+    WindowsProcess(const std::vector<const char *> &commandLineArgs,
+                   bool captureStdOut,
+                   bool captureStdErr)
+    {
+        mProcessInfo.hProcess = INVALID_HANDLE_VALUE;
+        mProcessInfo.hThread  = INVALID_HANDLE_VALUE;
+
+        std::vector<char> commandLineString;
+        for (const char *arg : commandLineArgs)
+        {
+            if (arg)
+            {
+                if (!commandLineString.empty())
+                {
+                    commandLineString.push_back(' ');
+                }
+                commandLineString.insert(commandLineString.end(), arg, arg + strlen(arg));
+            }
+        }
+        commandLineString.push_back('\0');
+
+        // Set the bInheritHandle flag so pipe handles are inherited.
+        SECURITY_ATTRIBUTES securityAttribs;
+        securityAttribs.nLength              = sizeof(SECURITY_ATTRIBUTES);
+        securityAttribs.bInheritHandle       = TRUE;
+        securityAttribs.lpSecurityDescriptor = nullptr;
+
+        STARTUPINFOA startInfo = {};
+
+        // Create pipes for stdout and stderr.
+        startInfo.cb        = sizeof(STARTUPINFOA);
+        startInfo.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+        if (captureStdOut)
+        {
+            if (!mStdoutPipe.initPipe(&securityAttribs))
+            {
+                return;
+            }
+            startInfo.hStdOutput = mStdoutPipe.writeHandle;
+        }
+        else
+        {
+            startInfo.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+        }
+
+        if (captureStdErr)
+        {
+            if (!mStderrPipe.initPipe(&securityAttribs))
+            {
+                return;
+            }
+            startInfo.hStdError = mStderrPipe.writeHandle;
+        }
+        else
+        {
+            startInfo.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+        }
+
+        if (captureStdOut || captureStdErr)
+        {
+            startInfo.dwFlags |= STARTF_USESTDHANDLES;
+        }
+
+        if (ShouldUseJobObjects())
+        {
+            // Create job object. Job objects allow us to automatically force child processes to
+            // exit if the parent process is unexpectedly killed. This should prevent ghost
+            // processes from hanging around.
+            mJobHandle = ::CreateJobObjectA(nullptr, nullptr);
+            if (mJobHandle == NULL)
+            {
+                std::cerr << "Error creating job object: " << GetLastError() << "\n";
+                return;
+            }
+
+            JOBOBJECT_EXTENDED_LIMIT_INFORMATION limitInfo = {};
+            limitInfo.BasicLimitInformation.LimitFlags     = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
+            if (::SetInformationJobObject(mJobHandle, JobObjectExtendedLimitInformation, &limitInfo,
+                                          sizeof(limitInfo)) == FALSE)
+            {
+                std::cerr << "Error setting job information: " << GetLastError() << "\n";
+                return;
+            }
+        }
+
+        // Create the child process.
+        if (::CreateProcessA(nullptr, commandLineString.data(), nullptr, nullptr,
+                             TRUE,  // Handles are inherited.
+                             0, nullptr, nullptr, &startInfo, &mProcessInfo) == FALSE)
+        {
+            std::cerr << "CreateProcessA Error code: " << GetLastError() << "\n";
+            return;
+        }
+
+        if (mJobHandle != nullptr)
+        {
+            if (::AssignProcessToJobObject(mJobHandle, mProcessInfo.hProcess) == FALSE)
+            {
+                std::cerr << "AssignProcessToJobObject failed: " << GetLastError() << "\n";
+                return;
+            }
+        }
+
+        // Close the write end of the pipes, so EOF can be generated when child exits.
+        if (!mStdoutPipe.closeWriteHandle() || !mStderrPipe.closeWriteHandle())
+            return;
+
+        mStarted = true;
+        mTimer.start();
+    }
+
+    ~WindowsProcess() override
+    {
+        if (mProcessInfo.hProcess != INVALID_HANDLE_VALUE)
+        {
+            ::CloseHandle(mProcessInfo.hProcess);
+        }
+        if (mProcessInfo.hThread != INVALID_HANDLE_VALUE)
+        {
+            ::CloseHandle(mProcessInfo.hThread);
+        }
+        if (mJobHandle != nullptr)
+        {
+            ::CloseHandle(mJobHandle);
+        }
+    }
+
+    bool started() override { return mStarted; }
+
+    bool finish() override
+    {
+        if (mStdoutPipe.valid())
+        {
+            ReadFromFile(true, mStdoutPipe.readHandle, &mStdout);
+        }
+
+        if (mStderrPipe.valid())
+        {
+            ReadFromFile(true, mStderrPipe.readHandle, &mStderr);
+        }
+
+        DWORD result = ::WaitForSingleObject(mProcessInfo.hProcess, INFINITE);
+        mTimer.stop();
+        return result == WAIT_OBJECT_0;
+    }
+
+    bool finished() override
+    {
+        if (!mStarted)
+            return false;
+
+        // Pipe stdin and stdout.
+        if (mStdoutPipe.valid())
+        {
+            ReadFromFile(false, mStdoutPipe.readHandle, &mStdout);
+        }
+
+        if (mStderrPipe.valid())
+        {
+            ReadFromFile(false, mStderrPipe.readHandle, &mStderr);
+        }
+
+        DWORD result = ::WaitForSingleObject(mProcessInfo.hProcess, 0);
+        if (result == WAIT_OBJECT_0)
+        {
+            mTimer.stop();
+            return true;
+        }
+        if (result == WAIT_TIMEOUT)
+            return false;
+
+        mTimer.stop();
+        std::cerr << "Unexpected result from WaitForSingleObject: " << result
+                  << ". Last error: " << ::GetLastError() << "\n";
+        return false;
+    }
+
+    int getExitCode() override
+    {
+        if (!mStarted)
+            return -1;
+
+        if (mProcessInfo.hProcess == INVALID_HANDLE_VALUE)
+            return -1;
+
+        DWORD exitCode = 0;
+        if (::GetExitCodeProcess(mProcessInfo.hProcess, &exitCode) == FALSE)
+            return -1;
+
+        return static_cast<int>(exitCode);
+    }
+
+    bool kill() override
+    {
+        if (!mStarted)
+            return true;
+
+        HANDLE newHandle;
+        if (::DuplicateHandle(::GetCurrentProcess(), mProcessInfo.hProcess, ::GetCurrentProcess(),
+                              &newHandle, PROCESS_ALL_ACCESS, false,
+                              DUPLICATE_CLOSE_SOURCE) == FALSE)
+        {
+            std::cerr << "Error getting permission to terminate process: " << ::GetLastError()
+                      << "\n";
+            return false;
+        }
+        mProcessInfo.hProcess = newHandle;
+
+        if (::TerminateThread(mProcessInfo.hThread, 1) == FALSE)
+        {
+            std::cerr << "TerminateThread failed: " << GetLastError() << "\n";
+            return false;
+        }
+
+        if (::TerminateProcess(mProcessInfo.hProcess, 1) == FALSE)
+        {
+            std::cerr << "TerminateProcess failed: " << GetLastError() << "\n";
+            return false;
+        }
+
+        mStarted = false;
+        mTimer.stop();
+        return true;
+    }
+
+  private:
+    bool mStarted = false;
+    ScopedPipe mStdoutPipe;
+    ScopedPipe mStderrPipe;
+    PROCESS_INFORMATION mProcessInfo = {};
+    HANDLE mJobHandle                = nullptr;
+};
 }  // anonymous namespace
 
 void Sleep(unsigned int milliseconds)
@@ -127,13 +480,18 @@
     OutputDebugStringA(buffer.data());
 }
 
-void InitCrashHandler()
+void InitCrashHandler(CrashCallback *callback)
 {
-    SetUnhandledExceptionFilter(StackTraceCrashHandler);
+    if (callback)
+    {
+        gCrashHandlerCallback = callback;
+    }
+    SetUnhandledExceptionFilter(CrashHandler);
 }
 
 void TerminateCrashHandler()
 {
+    gCrashHandlerCallback = nullptr;
     SetUnhandledExceptionFilter(nullptr);
 }
 
@@ -144,4 +502,61 @@
     RtlCaptureContext(&context);
     PrintBacktrace(&context);
 }
+
+Process *LaunchProcess(const std::vector<const char *> &args,
+                       bool captureStdout,
+                       bool captureStderr)
+{
+    return new WindowsProcess(args, captureStdout, captureStderr);
+}
+
+bool GetTempDir(char *tempDirOut, uint32_t maxDirNameLen)
+{
+    DWORD pathLen = ::GetTempPathA(maxDirNameLen, tempDirOut);
+    return (pathLen < MAX_PATH && pathLen > 0);
+}
+
+bool CreateTemporaryFileInDir(const char *dir, char *tempFileNameOut, uint32_t maxFileNameLen)
+{
+    char fileName[MAX_PATH + 1];
+    if (::GetTempFileNameA(dir, "ANGLE", 0, fileName) == 0)
+        return false;
+
+    strncpy(tempFileNameOut, fileName, maxFileNameLen);
+    return true;
+}
+
+bool DeleteFile(const char *path)
+{
+    if (strlen(path) >= MAX_PATH)
+        return false;
+
+    const DWORD attr = ::GetFileAttributesA(path);
+    // Report success if the file or path does not exist.
+    if (attr == INVALID_FILE_ATTRIBUTES)
+    {
+        return ReturnSuccessOnNotFound();
+    }
+
+    // Clear the read-only bit if it is set.
+    if ((attr & FILE_ATTRIBUTE_READONLY) &&
+        !::SetFileAttributesA(path, attr & ~FILE_ATTRIBUTE_READONLY))
+    {
+        // It's possible for |path| to be gone now under a race with other deleters.
+        return ReturnSuccessOnNotFound();
+    }
+
+    // We don't handle directories right now.
+    if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0)
+    {
+        return false;
+    }
+
+    return !!::DeleteFileA(path) ? true : ReturnSuccessOnNotFound();
+}
+
+int NumberOfProcessors()
+{
+    return ::GetActiveProcessorCount(ALL_PROCESSOR_GROUPS);
+}
 }  // namespace angle
diff --git a/Source/ThirdParty/ANGLE/util/windows/win32/Win32Window.cpp b/Source/ThirdParty/ANGLE/util/windows/win32/Win32Window.cpp
index c422915..d48192e 100644
--- a/Source/ThirdParty/ANGLE/util/windows/win32/Win32Window.cpp
+++ b/Source/ThirdParty/ANGLE/util/windows/win32/Win32Window.cpp
@@ -513,7 +513,7 @@
     // Work around compile error from not defining "UNICODE" while Chromium does
     const LPSTR idcArrow = MAKEINTRESOURCEA(32512);
 
-    WNDCLASSEXA parentWindowClass   = {0};
+    WNDCLASSEXA parentWindowClass   = {};
     parentWindowClass.cbSize        = sizeof(WNDCLASSEXA);
     parentWindowClass.style         = 0;
     parentWindowClass.lpfnWndProc   = WndProc;
@@ -530,7 +530,7 @@
         return false;
     }
 
-    WNDCLASSEXA childWindowClass   = {0};
+    WNDCLASSEXA childWindowClass   = {};
     childWindowClass.cbSize        = sizeof(WNDCLASSEXA);
     childWindowClass.style         = CS_OWNDC;
     childWindowClass.lpfnWndProc   = WndProc;
diff --git a/Source/ThirdParty/ANGLE/util/windows/win32/test_utils_win32.cpp b/Source/ThirdParty/ANGLE/util/windows/win32/test_utils_win32.cpp
index 4f4aa8d..9e08b23 100644
--- a/Source/ThirdParty/ANGLE/util/windows/win32/test_utils_win32.cpp
+++ b/Source/ThirdParty/ANGLE/util/windows/win32/test_utils_win32.cpp
@@ -11,9 +11,10 @@
 #include <windows.h>
 #include <array>
 
+#include "util/random_utils.h"
+
 namespace angle
 {
-
 void SetLowPriorityProcess()
 {
     SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS);
@@ -21,15 +22,15 @@
 
 bool StabilizeCPUForBenchmarking()
 {
-    if (SetThreadAffinityMask(GetCurrentThread(), 1) == 0)
+    if (::SetThreadAffinityMask(::GetCurrentThread(), 1) == 0)
     {
         return false;
     }
-    if (SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS) == FALSE)
+    if (::SetPriorityClass(::GetCurrentProcess(), REALTIME_PRIORITY_CLASS) == FALSE)
     {
         return false;
     }
-    if (SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL) == FALSE)
+    if (::SetThreadPriority(::GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL) == FALSE)
     {
         return false;
     }
diff --git a/Source/ThirdParty/ANGLE/util/x11/X11Window.h b/Source/ThirdParty/ANGLE/util/x11/X11Window.h
index 42aaa1d..7d04b8f 100644
--- a/Source/ThirdParty/ANGLE/util/x11/X11Window.h
+++ b/Source/ThirdParty/ANGLE/util/x11/X11Window.h
@@ -22,7 +22,7 @@
   public:
     X11Window();
     X11Window(int visualId);
-    ~X11Window();
+    ~X11Window() override;
 
     bool initialize(const std::string &name, int width, int height) override;
     void destroy() override;